當前位置:成語大全網 - 書法字典 - Java Swing多線程死鎖問題分析

Java Swing多線程死鎖問題分析

在基於Java Swing開發圖形界面時,我們經常會遇到Swing多線程的問題。我們可以考慮壹下。如果我們需要在圖形界面上顯示大量數據,這些數據是經過漫長而復雜的查詢和操作後獲得的。如果我們在圖形界面的同壹個線程中進行查詢和操作,界面會有壹段時間處於死狀態,這會給用戶帶來不好的交互感受。為了解決這個問題,通常會啟動壹個單獨的線程進行操作和查詢,並隨時更新圖形界面。這時,另壹個問題出現了,它不僅可能無法解決原來的偶爾崩潰問題,還可能導致程序的徹底死亡。幸運的是,在JDK隱藏著壹個中斷程序的快捷鍵,它就是CTRL+BREAK。Sun沒有在文檔中發布它。如果Java是在命令行模式下啟動的,程序然後按CTRL+BREAK來獲取堆棧的跟蹤信息,從中我們可以知道導致崩潰的具體位置。

當壹個程序出現死鎖時,妳肯定會想盡快找到原因並解決它。此時,您的壹般精力將用於查找導致死鎖的位置,而另壹半精力將用於跟蹤堆棧以確定死鎖的原因。然而,在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