成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java Swing多線程死鎖問題解析

原創
開發 后端
Java Swing是Java核心技術之一,通過改技術構造出的圖形界面非常美觀強大。但是在進行復雜開發,特別是多線程開發,則需要解決一些特殊問題。

【51CTO獨家特稿】在基于Java Swing進行圖形界面開發的時候,經常遇到的就是Swing多線程問題。我們可以想想一下,如果需要在一個圖形界面上顯示很多數據,這些數據是經過長時間、復雜的查詢和運算得到的。如果在圖形界面的同一個線程中進行查詢和運算工作則會導致一段時間界面處于死機狀態,這會給用戶帶來不良的互動感受。為了解決這個問題,一般會單獨啟動一個線程進行運算和查詢工作,并隨時更新圖形界面。這時候,另一個問題就出現了,可能不僅沒有解決原來偶爾死機問題,還可能導致程序徹底死掉。幸運的是在JDK中暗藏了一個中斷程序的快捷鍵,就是CTRL+BREAK,這個快捷鍵Sun并沒有在文檔中公布。如果在命令行模式下啟動Java程序,然后按CTRL+BREAK鍵,會得到堆棧的跟蹤信息。從這些跟蹤信息中就可以知道具體引發死機的位置了。

當一個程序產生死鎖的時候,你一定會希望盡快找到原因并且解決它。這時候,你一般的精力會用在查找引發死鎖的位置,另一半的精力會用于對堆棧進行跟蹤一確定引發死鎖的原因。但是在Java Swing程序中,你的所有努力可能都是沒有價值的。這是因為Java對Swing的多線程編程有一個特殊要求。就是在Swing里,只能在與Swing相同的線程里對GUI元件進行修改。

也就是說,如果你要執行類似于jLabel1.setText("blabla")代碼,必須在Swing線程中,而不允許在其他線程當中。如果必須在其他線程中修改元件,可以使用類似一下方式解決:

  1. SwingUtilities.invokeLater(new Runnable() {  
  2.     public void run() {  
  3.         jLabel1.setText("blabla");  
  4.     }  

invokeLater方法雖然表面有時間延遲執行含義,但是實際上幾乎沒有任何影響,可能在幾毫秒之內就會被執行。另外還有一個invokeAndWait方法,除非特殊需要,否則幾乎是不用的。

在不使用invokeLater的情況下,導致刷新問題是可以理解的,但是導致死鎖就優點令人匪夷所思了。幸運的是,不是任何時候都需要調用改方法,這是因為大多數情況下,我們都是在與Swing同一個線程里進行界面更新。例如監聽按鈕點擊事件的ActionListener.actionPerformed方法就是運行在與Swing相同的線程中的。但是如果在回調類中引用了另一個類,并且是不屬于AWT/Swing的,那么結果就很難確定了。所以說使用invokeLater應該是最安全的。

需要注意的是,在invokeLater做的任何事情,都會導致Swing線程窗口繪制工作暫停下來,等候invokeLater工作結束。所以不要在invokeLater進行耗時操作,盡量只執行那些界面繪制相關的工作??梢酝ㄟ^代碼重構,將那些與界面更新相關的代碼集中起來統一處理。

一個建議是那些在Swing中使用的類進行合理的設計。代碼執行前判斷是否處于Swing線程當中(使用SwingUtilities.isEventDispatchThread()方法),如果不是,則需要通過SwingUtilities.invokeLater(Runnable)執行,否則則直接執行代碼。但是這說起來簡單,但是實際操作會遇到很多困難。

【編輯推薦】

  1. 有趣的Java對象序列化緩存問題
  2. 關于Java對象序列化您不知道的5件事
  3. Java 7 I/O新功能探秘:同步操作,多播與隨機存取
  4. Java實用技巧:當不能拋出checked異常時
  5. 多線程開發的捷徑:構建Java并發模型框架
責任編輯:佚名 來源: 51CTO
相關推薦

2025-02-26 07:26:29

2020-08-13 08:45:09

多線程死鎖

2011-06-02 17:27:49

iphone 多線程

2009-08-27 13:55:08

C#子線程

2012-01-17 16:41:08

JavaSwing

2015-12-22 10:39:52

Java多線程問題

2017-01-19 10:24:38

Java多線程問題

2021-03-28 09:12:58

多線程死鎖技術熱點

2013-05-29 10:47:50

Android開發Java多線程java面試題

2010-03-16 19:29:26

Java多線程操作

2011-04-18 09:22:38

多線程

2010-02-01 17:25:09

Python多線程

2011-06-22 13:47:16

Java多線程

2012-07-24 17:10:10

Linux操作系統

2010-04-29 12:42:09

Unix系統

2011-06-22 13:57:54

Java多線程

2009-03-18 09:26:23

Winform多線程C#

2009-03-12 10:52:43

Java線程多線程

2019-09-26 10:19:27

設計電腦Java

2021-03-05 07:38:52

C++線程編程開發技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩视频中文字幕 | 国产99视频精品免费播放照片 | 欧美专区在线观看 | 亚洲免费在线视频 | 蜜桃av鲁一鲁一鲁一鲁 | 在线一区二区三区 | 欧美精品一区二区在线观看 | 福利成人 | 日本黄色免费视频 | 久久国产精品一区二区三区 | va在线 | 天天夜夜操 | 国产在线视频一区 | 91九色porny首页最多播放 | 国产精品久久久久无码av | 亚洲日本国产 | 亚洲电影一区二区三区 | 中文字幕一区在线观看视频 | 国产在线观看网站 | 国产午夜精品一区二区三区在线观看 | 一区中文字幕 | 成av在线| 狠狠亚洲 | 久久国产一区二区三区 | 欧美精品一区二区三区一线天视频 | 国产视频第一页 | 午夜在线视频一区二区三区 | 亚洲午夜一区二区 | 精品国产第一区二区三区 | 欧美综合一区 | 国产特级毛片 | 日韩av免费在线电影 | 超碰导航 | 亚洲精品在线看 | 国产日韩91 | 国产精品久久久久久久午夜片 | 国产精品乱码一二三区的特点 | 成人在线h | 成人无遮挡毛片免费看 | 久久这里只有精品首页 | 成人精品一区二区户外勾搭野战 |