當壹個程序出現死鎖時,妳肯定會想盡快找到原因並解決它。此時,您的壹般精力將用於查找導致死鎖的位置,而另壹半精力將用於跟蹤堆棧以確定死鎖的原因。然而,在Java Swing程序中,您的所有努力可能都毫無價值,因為Java對Swing多線程編程有壹個特殊的要求,即GUI組件只能在與Swing相同的線程中修改。
也就是說,如果要執行類似jLabel setText(blabla)的代碼,它必須在Swing線程中而不是在其他線程中。如果您必須修改其他線程中的組件,可以用類似的方法解決。
swing utilities invoke later(new Runnable(){
公共void運行(){
jLabel setText(blabla);
}
}
雖然invokeLater方法看起來有時間延遲的意思,但實際上幾乎沒有任何作用,它可能會在幾毫秒內執行。此外,還有另壹個invokeAndWait方法,除非特別需要,否則幾乎沒有必要。
不使用invokeLater導致刷新問題是可以理解的,但死鎖的優勢令人難以置信。幸運的是,我們不需要在任何時候調用change方法。這是因為在大多數情況下,我們在與Swing相同的線程中更新接口,例如ActionListener actionPerformed方法,該方法偵聽按鈕單擊事件。在與Swing相同的線程中運行,但如果回調類中引用了另壹個類,並且它不屬於AWT/Swing,則結果很難確定,因此使用invokeLater應該是最安全的。
需要註意的是,在Invoke later中做的任何事情都會導致Swing線程窗口的繪制工作停止,等待Invoke later的工作完成,所以不要在Invoke later中做耗時的操作,盡量只執行與界面繪制相關的工作。通過代碼重構,可以將界面更新相關的代碼集中起來統壹處理。
lishixinzhi/Article/program/Java/gj/201311/27498