大家好: 基本上我需要在用户按下终止按钮时终止或停止运行的线程。此线程循环遍历数组列表并在 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可安全用于多线程使用的集合包。
关于Java 杀死或终止一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4472611/