亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Swing之EDT簡析

2019-11-06 06:09:23
字體:
來源:轉載
供稿:網友

java Swing 是一個單線程圖形庫,里面絕大多數的代碼不是線程安全的(thread-safe),Swing組件大多數沒有做同步線程安全處理,也就是說任何地方都能隨便調用,在不同的線程里面隨便使用這些API去更新界面元素和設置值,都可能會出現一些問題。 Swing框架使用了Event Queue和EDT(Event-Dispatch-Thread)來保證線程是安全的。在GUI界面上發出的請求事件如窗口移動,刷新,按鈕點擊等不管是單個的還是并發的,都會背包放入事件隊列(Event Queue )里面進行排隊,然后事件分發線程(EDT)將會將它們一個個的取出,分派到相應的事件處理方法中。 Swing是單線程圖形包就是因為處理GUI事件的事件分發線程只有一個,只要不停之GUI程序,EDT就會永不間斷去處理請求。其優點是:1、將同步操作轉化為異步操作;2、將并行處理轉換為串行處理。 Swing編程時應該注意以下三點: 1.從其他線程訪問UI組件及其事件處理器可能會導致界面更新和繪制錯誤。 2.在EDT上執行耗時任務會使程序失去響應,這會使GUI事件阻塞在隊列中得不到處理 3.應該使用獨立的線程任務來執行耗時計算或輸入輸出密集型任務,比如同數據庫通信、訪問網站資源、讀寫大數據量的文件

許多程序使用下面方法啟動界面,但這是錯誤的啟動UI界面的方法:

public class MainFrameextends javax.swing.JFrame { … public static void main(String[] args){ new MainFrame().setVisible(true); }}

盡管這種錯誤出現在開始,但仍然違反了不應在EDT外的其他線程同Swing組件交互的原則。這個錯誤尤其容易犯,線程同步問題雖然不是馬上顯示出來,但是還要注意避免這樣書寫。

正確啟動UI界面應該如下:

public class MainFrame extends javax.swing.JFrame{ … public static void main(String[] args){ SwingUtilities.invokeLater(new Runnable(){ public void run(){ newMainFrame().setVisible(true); } }); }}

當運行一個Swing程序時,會自動創建三個線程。 1.主線程,負責執行main 方法 2. toolkit 線程,負責捕捉系統事件,比如鍵盤、鼠標移動等,程序員不會有任何代碼在這個線程上執行。Toolkit線程的作用是把自己捕獲的事件傳遞給第三個線程,也就是事件派發線程。 3. 事件派發線程(EDT,Event Dispatcher Thread),顧名思義是用來派發事件(根據事件找到對應的事件處理代碼)的線程。EDT接收來自 toolkit 線程的事件,并且將這些事件組織成一個隊列,EDT的工作內容就是將這個隊列中的事件按照順序派發給相應的事件監聽器,并且調用事件監聽器中的回調函數,這也意味著,所有的事件處理代碼都是在EDT而不是主線程中執行。 4. 上面說到EDT中維護了一個事件的隊列,并且它們是按照順序派發的。由于事件派發是單線程的操作,所以只有等待前面事件監聽器的回調函數執行完畢,才能夠執行組件更新的操作,以及繼續派發后面的事件。這樣導致的一個后果就是:當在一個事件監聽回調函數中做了耗時的操作,那么,界面會因此停住,并且界面上所有控件失效(不可觸發)。 解決這個問題的方法是:在事件處理函數中將耗時的操作放到新線程(一般稱之為工作線程)中執行,而不是讓其在EDT中執行。 一個窗口,有一個按鈕和一個label。點擊按鈕,系統將做模仿導入數據的動作,導入數據之前需要檢測數據的合法性。并且,檢測數據和導入數據這兩個步驟都需要耗費一定的時間。 如果沒有之前說到的EDT的概念,那么你可能會這么做:

importBtn.addActionListener(newActionListener() { @Override publicvoid actionPerformed(ActionEvent e) { try{ lb.setText("1.檢查數據合法性..."); Thread.sleep(3000);//模仿檢測數據合法性 lb.setText("2.正在導入數據..."); Thread.sleep(4000);//模仿導入數據 lb.setText("3.導入成功!"); }catch (InterruptedException e1) { e1.PRintStackTrace(); } } });

但是,如果運行一下的話,會發現現象是這樣:點擊按鈕,界面卡住,按鈕變得不可觸發,直到一段時間(7秒)之后界面顯示“3.導入成功”。期間并沒有顯示“1.檢查數據合法性”和“2.正在導入數據”。 這個現象印證了上面說的理論:當事件派發線程中正在執行的事件監聽函數執行完畢,才能進行UI組件的刷新操作,并且派發事件隊列中的下一個。

package test;import java.awt.FlowLayout;import java.awt.HeadlessException;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JProgressBar;import javax.swing.JTextField;import javax.swing.SwingUtilities;public class SwingThreadTest3 extends JFrame { /** * */ private static final long serialVersionUID = -6785759504284102780L; private JProgressBar progressBar = new JProgressBar(); //進度條 private JTextField text = new JTextField(10); private JButton start = new JButton("Start"); private JButton end = new JButton("End"); private boolean flag = false; private int count =0; private GoThread t = null; //繼續線程 private Runnable run = null; //更新組件線程 public SwingThreadTest3() { this.setLayout(new FlowLayout()); add(progressBar); text.setEditable(flag); add(text); add(start); add(end); start.addActionListener(new Start()); end.addActionListener(new End()); run = new Runnable() { public void run() { progressBar.setValue(count); text.setText("Completed : " + String.valueOf(count) + "%"); } }; } class GoThread extends Thread { @Override public void run() { while (count < 100) { try { Thread.sleep(100); //線程沉睡 } catch (Exception e) { e.printStackTrace(); } if (flag) { count++; SwingUtilities.invokeLater(run); //將對象排到事件派發線程的隊列中 } } } } private class Start implements ActionListener { public void actionPerformed(ActionEvent e) { flag = true; if(t == null) { t = new GoThread(); t.start(); } } } private class End implements ActionListener { public void actionPerformed(ActionEvent e) { flag = false; } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { SwingThreadTest3 s3 = new SwingThreadTest3(); s3.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); s3.setSize(300, 300); s3.setVisible(true); } }); }}

參考資料:http://983836259.blog.51cto.com/7311475/1724198 http://developer.51cto.com/art/201201/313034.htm


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产v综合v亚洲欧美久久| 亚洲美女精品久久| 欧美极品少妇xxxxⅹ裸体艺术| 久久99热这里只有精品国产| 精品福利在线看| 日韩欧美在线免费| 久久综合久中文字幕青草| 久久久国产成人精品| 高清在线视频日韩欧美| 欧美老女人性生活| 97精品国产97久久久久久免费| 久久久久国产精品免费| 在线日韩第一页| 国产综合在线视频| 欧美性猛交xxxx久久久| 欧美精品激情在线观看| 欧美日韩国产999| 精品久久久国产精品999| 国产日韩av高清| 亚洲精品小视频在线观看| 91九色精品视频| 亚洲毛片在线免费观看| 欧美日韩免费区域视频在线观看| 久久精品影视伊人网| 自拍偷拍亚洲精品| 国产精品自拍网| 在线观看国产精品日韩av| 国产视频精品免费播放| 欧美激情va永久在线播放| 国产丝袜一区二区三区| 成人天堂噜噜噜| 亚洲精品成人免费| 在线观看欧美视频| 最新91在线视频| 91久久精品在线| 狠狠久久亚洲欧美专区| 国产精品久久久久久久天堂| 日韩精品久久久久久福利| 精品久久久久久久大神国产| 欧美乱大交做爰xxxⅹ性3| 久久精品中文字幕电影| 亚洲天堂av图片| 国产亚洲欧洲黄色| 国产精品第一第二| 欧美成人性生活| 欧美精品午夜视频| 日日骚av一区| 97香蕉久久夜色精品国产| 精品中文字幕在线2019| 国产精品高潮呻吟久久av黑人| 国内精品一区二区三区四区| 久久99精品视频一区97| 亚洲最大福利网站| 中文字幕在线看视频国产欧美| 亚洲欧美综合另类中字| 6080yy精品一区二区三区| 国产精品一区二区三区成人| 国产成人精品在线观看| 国产视频精品va久久久久久| 欧美激情一级欧美精品| 91香蕉国产在线观看| 自拍偷拍亚洲欧美| 日韩av一区二区在线| 韩国三级日本三级少妇99| 97超级碰碰碰久久久| 色吧影院999| 久久久久免费精品国产| 亚洲天堂av女优| 国产精品免费观看在线| 欧美一区二区三区……| 91理论片午午论夜理片久久| 成人免费黄色网| 韩国精品久久久999| 国产精品18久久久久久麻辣| 2019av中文字幕| 亚洲午夜久久久影院| 少妇av一区二区三区| 欧美孕妇与黑人孕交| 亚洲视频在线免费看| 中文字幕在线看视频国产欧美在线看完整| 亚洲国产日韩一区| 中文字幕日韩在线观看| 亚洲成人免费在线视频| 丰满岳妇乱一区二区三区| 福利二区91精品bt7086| 琪琪第一精品导航| 亚洲国产精品网站| 国产精品稀缺呦系列在线| 国产精品美女www爽爽爽视频| 日韩欧美国产网站| 日韩精品999| 中文字幕欧美精品日韩中文字幕| 久久久久久久久爱| 欧美精品在线免费| 国产精品 欧美在线| 亚洲欧洲一区二区三区在线观看| 国产噜噜噜噜久久久久久久久| 精品亚洲va在线va天堂资源站| 5278欧美一区二区三区| 久久久国产精品x99av| 正在播放欧美视频| 日韩欧美在线播放| 国产精品第一页在线| 成人有码在线播放| 91精品国产高清久久久久久久久| 日韩最新在线视频| 日韩视频在线免费观看| 国产精品丝袜一区二区三区| 91极品视频在线| 91香蕉嫩草影院入口| 国产69精品久久久久久| 97精品久久久| 精品久久久久久久久久国产| 日韩在线视频二区| 国产一区二区三区在线观看视频| 亚洲一区二区中文字幕| 欧美色欧美亚洲高清在线视频| 欧美日韩国产一区二区三区| 亚州精品天堂中文字幕| 成人免费看片视频| 成人在线小视频| 欧美激情乱人伦一区| 91av在线视频观看| xvideos成人免费中文版| 在线观看日韩视频| 久久久久久成人| 久久久精品在线观看| 亚洲男人天堂九九视频| 亚洲一二在线观看| 亚洲久久久久久久久久| 亚洲另类激情图| 亚洲电影免费观看高清完整版| 久久夜色精品国产欧美乱| 亚洲国产精品久久精品怡红院| 亚洲韩国青草视频| 久久视频精品在线| 日韩av一区二区在线观看| 欧美性理论片在线观看片免费| 国产精品久久久久久久久久久新郎| 亚洲欧美一区二区三区久久| 亚洲人成电影在线播放| 成人亚洲综合色就1024| 在线观看国产精品日韩av| 久久夜精品va视频免费观看| 清纯唯美日韩制服另类| 综合av色偷偷网| 国产精品视频xxx| 国产精品第三页| 亚洲精品视频二区| 91九色国产社区在线观看| 欧美午夜无遮挡| 久久天天躁日日躁| 欧美激情一二三| 日韩av中文字幕在线| 中文字幕国产亚洲2019| 国产精品丝袜白浆摸在线| 日韩av一区在线| 欧美精品少妇videofree| 97av在线播放| 日韩av在线看| 亚洲天堂色网站| 精品久久久久久国产91| 久久久精品中文字幕| 欧美综合一区第一页|