摆动和处理线程

时间:2010-06-05 11:29:44

标签: java swing multithreading

关于使用Swing api进行线程化的问题,StackOverflow上有几个问题,但事情仍然不明确。 EDT有什么问题,使用Swing启动Thread的正确方法是什么?在什么情况下应该使用它?

P.S:在良好做法方面的任何来源都将受到赞赏。

3 个答案:

答案 0 :(得分:2)

查看事件派发线程herehere上的java教程。因此Event dispatch thread是处理所有UI事件的地方。这允许所有UI操作代码存在于一个线程(EDT)中,因此消除了任何线程安全问题。

答案 1 :(得分:1)

我可能会从SwingWorker开始。

答案 2 :(得分:1)

这个评论太长了所以我做了一个答案。

EDT的一个问题,不一定是众所周知的,在很多情况下,Swing会默默地吃掉异常并重启一个新的EDT。

通常有一种错误的信念,即在程序的生命周期中有一个 EDT:但事实并非如此。每次EDT死亡时,都会创建一个新的EDT。

人们通常会谈论“EDT”,好像在应用程序的生命周期中有一个独特的EDT:但事实并非如此。重新启动多次新EDT并不罕见。

请注意,如果不是这种方式,所有非平凡的Swing程序都不会工作很长时间,因为Swing API本身包含了很多实际触发的错误异常,因此在应用程序的生命周期中有几个“EDT死亡/新EDT创建”循环。

“EDT死亡/新EDT创建”循环可以通过故意破坏EDT来轻易复制:

public void actionPerformed( ActionEvent e ) {
    System.out.println( "Thread ID:" + Thread.currentThread().getId() );
    System.out.println( 0 / Math.abs(0) );
}

如果您将此ActionListener附加到 JButton ,您会看到每次单击该按钮时,EDT都会有一个新的线程ID。

通过添加默认的未捕获异常处理程序(以及通过读取大量的Swing错误触发Sun漏洞中的异常),可以看到非平凡的Swing程序由于Java API中的错误而导致EDT崩溃的事实游行)。

默认情况下,这些都隐藏在Java程序员中,因为当发生这些Swing API异常时,只需启动一个新的EDT。

请注意,这并不会改变长度计算应该在EDT之外运行的事实。