关于使用Swing api进行线程化的问题,StackOverflow上有几个问题,但事情仍然不明确。 EDT有什么问题,使用Swing启动Thread
的正确方法是什么?在什么情况下应该使用它?
答案 0 :(得分:2)
查看事件派发线程here和here上的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之外运行的事实。