Jac*_*ack 0 java concurrency swing
我需要执行/显示从Arraylist到JTextArea的一系列事件,但是,每个事件都会以不同的时间执行.以下是代码,它在循环中的第二个Event处失败:
Thread worker = new Thread(new Runnable()
{
public void run()
{
while (eventList.size() > 0)
for (Event ev : eventList)
if(ev.ready())
{
/*try
{
Thread.sleep(1000);
} catch (InterruptedException e1)
{
e1.printStackTrace();
}*/
jTextArea.append(ev.toString() + "\n");
eventList.remove(ev);
}
}
});
worker.start();
Run Code Online (Sandbox Code Playgroud)
我猜你有一个ConcurrentModificationException.尝试使用迭代器,如下所示:
Iterator<Event> it = eventList.iterator();
while(it.hasNext())
{
Event ev = it.next();
if (ev.ready())
it.remove();
}
Run Code Online (Sandbox Code Playgroud)
编辑 为什么会抛出ConcurrentModificationException?
如果您遍历集合,使用Iterator直接或使用for(E : list),以及你修改集合,通过调用add,remove或类似的,你会得到这个例外.这试图表明代码中存在问题.问题是,一段代码想要遍历所有对象,而另一段代码则添加或删除对象.第一段代码陷入困境,如果集合不断变化,它如何循环遍历所有内容?所以,"他们"决定了,你是不是允许改变的集合,当你在它循环.(除非你使用迭代器更改它,你用来循环,就像这个代码那样.it.remove())it是循环迭代器,因此不会失败.)希望这是有道理的.