java swing并发在JTextArea中循环显示文本

标签 java swing concurrency

我需要执行/显示从 Arraylist 到 JTextArea 的一系列事件,但是,每个事件的执行时间不同。以下是代码,在循环中的第二个事件处失败:

   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();

最佳答案

我猜你遇到了ConcurrentModificationException。尝试使用迭代器,如下所示:

Iterator<Event> it = eventList.iterator();
while(it.hasNext())
{
  Event ev = it.next();
  if (ev.ready())
    it.remove();
}
<小时/>

编辑 为什么会抛出ConcurrentModificationException?

如果您循环访问集合,直接使用Iterator或使用for(E : list)并且您会修改集合,通过调用 addremove 或类似方法,您将得到此异常。这试图表明代码中存在问题。问题是,一段代码想要循环所有对象,而另一段代码则添加或删除对象。第一段代码遇到了麻烦,如果集合不断变化,它如何循环遍历所有内容?所以“他们”决定,当您循环遍历集合时,您不允许更改集合。 (除非您使用用于循环的迭代器更改它,就像此代码一样。it.remove()it 是循环迭代器,因此不会失败。)希望这是有道理的。

关于java swing并发在JTextArea中循环显示文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4454831/

相关文章:

java - RestEasy:警告 NoClassDefFoundError DocumentProvider

java - 以 maner 方式设置 JTextField 宽度以包装给定文本

java - 如何在 Swing 中分析 EDT?

ios - NSOperation 与 Grand Central Dispatch

java - RestFul 服务(spring3)客户端 java?

java - android应用程序在最小化应用程序后自动启动

java - 借助代码进行字符串打印有什么问题

java - 更改 JDialogs 模式以仅阻止一个 JFrame

ios - Grand Central Dispatch,不确定我是否完全理解这一点,这就是我的使用方式

java - 并发数据结构的想法