大家好:
基本上,当用户按下“终止”按钮时,我需要终止或停止正在运行的线程。该线程循环遍历数组列表并在 JTextArea 上显示每个事件。要求是当用户按下“终止”按钮时,我需要终止正在运行的线程,同时向数组列表添加一个新的“终止”事件,并让它再次运行以打印“编程终止”。以下代码有点“有效”,但我在控制台中收到 java.util.ConcurrentModificationException 。有人可以帮忙吗?
public void startEvents()
{
terminate = false;
worker = new Thread(new Runnable()
{
public void run()
{
Iterator<Event> it = eventList.iterator();
while (it.hasNext())
{
waitWhileSuspended();
terminatEvents();
Event ev = it.next();
try
{
Thread.sleep(ev.getDelayTime());
} catch (InterruptedException e1)
{
e1.printStackTrace();
}
jTextArea.append(ev.toString() + "\n");
it.remove();
}
jbStart.setEnabled(true);
jmiStart.setEnabled(true);
jbRestart.setEnabled(true);
jmiRestart.setEnabled(true);
}
});
worker.start();
}
public void terminatEvents()
{
while(terminate)
{
Thread.yield();
eventList.clear();
eventList.add(new Terminate(delayTime));
startEvents();
}
}
问题是您正在修改列表并同时循环它。对于标准列表,其行为是未定义的,并且会引发异常。
看看java.util.concurrent http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html用于多线程使用安全的集合的包。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)