国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Swing多線(xiàn)程編碼過(guò)程中的誤區(qū)

開(kāi)發(fā) 后端
很多學(xué)JAVA程序員都是從Swing開(kāi)始的,但很多人對(duì)AWT GUI線(xiàn)程的機(jī)制并沒(méi)有太深的了解,或者說(shuō)一直都只了解線(xiàn)程的概念,而不了解AWT對(duì)線(xiàn)程的使用。我發(fā)現(xiàn)很多人碰到線(xiàn)程阻塞的問(wèn)題,就通過(guò)調(diào)用 SwingUtilities.invokeLater()來(lái)解決。

很多學(xué)JAVA程序員都是從Swing開(kāi)始的,但很多人對(duì)AWT GUI線(xiàn)程的機(jī)制并沒(méi)有太深的了解,或者說(shuō)一直都只了解線(xiàn)程的概念,而不了解AWT對(duì)線(xiàn)程的使用。我發(fā)現(xiàn)很多人碰到線(xiàn)程阻塞的問(wèn)題,就通過(guò)調(diào)用 SwingUtilities.invokeLater()來(lái)解決。

其實(shí)這是很容易造成誤會(huì)的地方:

  1. 不要以為Swing 是多線(xiàn)程的,實(shí)際上Swing 的UI是單線(xiàn)程的
  2. 不要以為SwingUtilities.的兩個(gè)invoke是多線(xiàn)程,實(shí)際上它還是單線(xiàn)程的
  3. 不要以為invokeLater的意思是當(dāng)前線(xiàn)程執(zhí)行完再執(zhí)行目標(biāo)線(xiàn)程;以為invokeAndWait的意思是等待目標(biāo)線(xiàn)程執(zhí)行完再執(zhí)行當(dāng)前線(xiàn)程,實(shí)際上壓根就不是那么回事

問(wèn)題代碼1:大意是在按下某個(gè)按鈕的時(shí)候調(diào)用一個(gè)遠(yuǎn)程服務(wù)

  1. JButton button = new JButton();   
  2. button.addActionListener(new ActionListener(){   
  3. @Override   
  4. public void actionPerformed(ActionEvent e) {   
  5. invokeRemoteService();//可能需要等待   
  6. }   
  7. });  

在swing系統(tǒng)中,有一個(gè)頂級(jí)的java.awt.Container(可能是一個(gè)JFrame或JDialog實(shí)例),負(fù)責(zé)啟動(dòng)一個(gè)EventDispatchThread線(xiàn)程,單線(xiàn)程,這個(gè)線(xiàn)程是負(fù)責(zé)處理UI事件的。

首先,界面Swing控件向EventDispatchThread的EventQueue提交一個(gè)event,由 EventDispatchThread負(fù)責(zé)調(diào)度各個(gè)event的執(zhí)行。例如,按下一個(gè)JButton的時(shí)候,JButton向EventQueue執(zhí)行 postEvent,提交一個(gè)ActionEvent。EventDispatchThread線(xiàn)程根據(jù)調(diào)度算法執(zhí)行到該event的時(shí)候,會(huì)調(diào)用 JButton上的processActionEvent,JButton再調(diào)用actionPerformed,這過(guò)程并沒(méi)有執(zhí)行任何new Thread().start()代碼,也就是說(shuō)JButton的ActionListener.actionPerformed()中的代碼完全是在 EventDispatchThread線(xiàn)程內(nèi)執(zhí)行的。

所以,假如我們?cè)谌魏蜛ctionListener、MouseListener等對(duì)象中編寫(xiě)耗時(shí)的邏輯,那么整個(gè)Swing系統(tǒng)就會(huì)出現(xiàn)響應(yīng)遲鈍的現(xiàn)象,更有甚者,如果在這些Listener中執(zhí)行線(xiàn)程wait(),以等待另一個(gè)線(xiàn)程的鎖定資源或計(jì)算結(jié)果,那么實(shí)際上就是 EventDispatchThread線(xiàn)程被阻塞,整個(gè)系統(tǒng)界面就會(huì)處于無(wú)響應(yīng)狀態(tài),一點(diǎn)反應(yīng)都沒(méi)有。

以上是誤解1造成的,了解這個(gè)過(guò)程,就很容易看出上面這段代碼的問(wèn)題是什么原因了。解決的方法也倒比較簡(jiǎn)單,直接new Thread().start();就可以保證EventDispatchThread執(zhí)行到當(dāng)前方法的時(shí)候快速返回,以便可以去響應(yīng)來(lái)自用戶(hù)界面的其他事件。

問(wèn)題代碼2:大意是在按下某個(gè)按鈕的時(shí)候調(diào)用一個(gè)遠(yuǎn)程服務(wù),同時(shí)處理其他事情

  1. JButton button = new JButton();   
  2. button.addActionListener(new ActionListener(){   
  3. @Override   
  4. public void actionPerformed(ActionEvent e) {   
  5. //位置A   
  6. SwingUtilities.invokeLater(new Runnable() {   
  7.      public void run() {   
  8. //位置B   
  9.          invokeRemoteService();//可能需要等待   
  10.      }   
  11. });   
  12. doOtherThing();   
  13. }   
  14. });  

這段代碼跟第一段代碼唯一的差別是doOtherThing()在invokeRemoteService ()完成之前就能夠得到執(zhí)行,所以造成了invokeRemoteService ()/doOtherThing()好像是在兩個(gè)線(xiàn)程里執(zhí)行的假象。實(shí)際上invokeLater是把目標(biāo)代碼打包成一個(gè)Event提交到 EventQueue去了,等到EventDispatchThread線(xiàn)程執(zhí)行完當(dāng)前代碼段的doOtherThing()后,再去執(zhí)行這個(gè) EventQueue中的Event,這時(shí)候就會(huì)執(zhí)行到這個(gè)invokeRemoteService ()方法。但是,實(shí)際上這兩個(gè)方法都是在EventDispatchThread中執(zhí)行的,并沒(méi)有任何其他Thread來(lái)執(zhí)行。于是,問(wèn)題1的問(wèn)題還是沒(méi)解決。實(shí)際上直接new Thread().start()方法就可以了,使用SwingUtilities完全是由于誤解造成的濫用。

測(cè)試方法,在位置A和位置B都加上下面這行代碼:

  1. System.out.println(Thread.currentThread().getId() + Thread.currentThread().getName());  

返回的結(jié)果都是一樣的:

21AWT-EventQueue-0

21AWT-EventQueue-0 

[討論]

一般情況下(除了系統(tǒng)啟動(dòng)時(shí)后臺(tái)創(chuàng)建的Daemon線(xiàn)程),系統(tǒng)的所有執(zhí)行功能邏輯和業(yè)務(wù)邏輯的線(xiàn)程都應(yīng)該是從界面操作觸發(fā)的。我們應(yīng)該清楚哪些需要或應(yīng)該放到EventDispatchThread中去執(zhí)行,哪些需要或應(yīng)該創(chuàng)建一個(gè)新線(xiàn)程去執(zhí)行,也需要清醒的知道自己當(dāng)前編寫(xiě)的是屬于什么邏輯。

這個(gè)問(wèn)題我覺(jué)得應(yīng)該把代碼分成3層,第一層,UI層,包括UI控件上的Listener邏輯,這是應(yīng)該給EventDispatchThread 去執(zhí)行的,必須簡(jiǎn)短高效,快速return;這一層做不完的事情通過(guò)new Thread().start()交給下一層去做,我稱(chēng)之為控制層;然后控制層再去調(diào)用具體的業(yè)務(wù)代碼,即第三層,業(yè)務(wù)層。所有由UI控件觸發(fā)的邏輯都應(yīng)該這么分。

另一個(gè)問(wèn)題是,Swing并不推薦在EventDispatchThread之外修改界面,那么,如果我們?cè)跇I(yè)務(wù)層需要repaint某個(gè)控件,或者updateUI應(yīng)該怎么辦呢,那就可以使用SwingUtilities來(lái)處理了,這才是正確使用SwingUtilities的場(chǎng)景,也是設(shè)計(jì)這個(gè)工具的目的。

原文鏈接:http://seaman.iteye.com/blog/608584

【編輯推薦】

  1. 控件位置可以配置的Swing桌面
  2. Swing特效:漸顯效果
  3. 簡(jiǎn)述Java圖形用戶(hù)界面設(shè)計(jì)(Swing)
  4. 用Swing制作精美的圖層疊加圖
  5. 簡(jiǎn)述Java圖形用戶(hù)界面設(shè)計(jì)(Swing)
責(zé)任編輯:林師授 來(lái)源: seaman的博客
相關(guān)推薦

2011-05-03 10:31:59

噴墨打印機(jī)注墨誤區(qū)

2010-09-13 10:00:51

CSS注釋

2012-06-14 08:46:03

IDC云計(jì)算

2009-05-15 09:33:52

開(kāi)發(fā)線(xiàn)程沖突lock

2025-07-24 11:41:36

2009-07-16 08:53:03

Swing任務(wù)Swing線(xiàn)程

2009-07-16 09:54:44

LookupEventSwing線(xiàn)程

2010-05-24 14:04:48

JavaSwing多線(xiàn)程

2009-07-16 09:28:37

軟件開(kāi)發(fā)過(guò)程

2009-07-14 15:34:22

Swing中的線(xiàn)程GUI程序

2009-04-30 09:10:42

JavaSwing線(xiàn)程安全

2022-09-06 08:25:13

線(xiàn)程異步任務(wù)

2009-07-23 14:10:38

Hibernate J

2013-08-15 12:26:40

阿里云飛天

2010-07-01 14:05:43

SNMPMIB

2011-04-11 17:28:50

oracle存儲(chǔ)select語(yǔ)句

2025-06-25 09:06:18

2022-03-07 07:57:04

Linux工具內(nèi)存

2010-05-31 16:57:09

2010-05-27 17:45:13

MySQL存儲(chǔ)過(guò)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

澳门成人av| 巨茎人妖videos另类| 国产成人午夜性a一级毛片| 久久久综合视频| www.xxx黄| 快she精品国产999| 欧美日韩福利电影| av在线导航| 夜夜嗨av一区二区三区网页| 黄色a级片免费看| 欧美日韩中文字幕一区二区三区 | 一级做a爰片久久| 精品国产aⅴ| 日韩精品中文字幕久久臀| 电影av一区| 国产精品乱子久久久久| 亚洲AV无码成人精品一区| 在线免费高清一区二区三区| 亚洲欧美精品伊人久久| 翔田千里一区| 中文一区二区在线观看| 国产三区在线视频| 久久99国产精品久久99| 亚洲国产一区二区三区在线| 中文在线аv在线| 欧美性感一区二区三区| 福利资源在线久| 欧美激情在线看| 午夜免费高清视频| 日韩电影在线观看网站| 亚洲免费精彩视频| 成年人视频免费在线观看| 26uuu久久天堂性欧美| av黄色在线网站| 26uuu成人网一区二区三区| 香蕉久久免费影视| 日韩激情一区二区| 亚洲精品中字| 久久婷婷综合激情| 亚洲综合中文字幕68页| 同性恋视频一区| 欧美贵妇videos办公室| 亚洲视频三区| 91精品国产自产91精品| 亚洲+小说+欧美+激情+另类| 中文字幕在线精品| 国产91在线精品| 精品国产免费久久| 99国产在线视频| 亚洲欧洲视频| 欧美极品欧美精品欧美| 亚洲国产另类av| 电影在线高清| 不卡av在线网站| 亚洲精品亚洲人成在线观看| 日韩一区二区三区视频| 午夜在线网站| 欧美日韩三级在线| julia一区二区三区中文字幕| 国模视频一区二区| 亚洲视频1区| 午夜免费看视频| 欧美不卡在线视频| 日韩欧美中文字幕一区二区三区| 91网免费观看| 国产精品毛片无遮挡高清| 欧美jizzhd69巨大| 久久偷看各类女兵18女厕嘘嘘| 欧美日本不卡| 色猫av在线| 欧美伦理视频网站| 日韩精品在线视频观看| 亚洲国产精品一区在线观看不卡 | 日本韩国欧美一区二区三区| 免费一级在线观看| 91麻豆精品国产综合久久久久久| 国产精品探花在线| 中文亚洲视频在线| 女同久久另类99精品国产| 国产精品成人v| 欧美日韩国产高清| 欧美h视频在线观看| av亚洲精华国产精华精华| 97在线观视频免费观看| 在线观看成人小视频| 大黄网站在线观看| 久久久久久久久久久成人| 国产精品成久久久久| 性欧美精品一区二区三区在线播放 | 99精品视频免费观看视频| 亚州欧美一区三区三区在线| 久久久久国产精品麻豆| 污视频免费在线看| 日韩电影在线观看中文字幕| 久久亚洲黄色| 神马影院一区二区| 国产精品成人免费 | 99r精品视频| 在线观看视频你懂的| 亚洲成人国产精品| 久久av免费看| 成人在线观看www| 亚洲一区电影777| 国产精品论坛| 国产免费一区二区三区在线能观看| 奇米影视在线99精品| 成人蜜桃视频网站网址| 欧美日韩一卡二卡三卡| 久久中文字幕一区二区| 免费看国产精品一二区视频| 中文字幕中文字幕在线一区| 日日夜夜天天综合入口| 国产精品高清在线观看| 国产成人超碰人人澡人人澡| 成人免费一区二区三区视频网站| 欧美成人激情视频| 日本欧美在线观看| 在线观看av中文| 欧美黑人又粗大| 精品亚洲porn| 成人p站proumb入口| 91av在线播放| 成人毛片视频在线观看| 欧美性天天影视| 91精品久久久久久久久久久久久久 | 淫片在线观看| 欧美一级大片在线免费观看| 七七婷婷婷婷精品国产| 日本不卡免费播放| 欧美精品videos| 狠狠色丁香婷婷综合| jyzzz在线观看视频| 欧美伊久线香蕉线新在线| 国产成人在线视频播放| 久久99久久99精品中文字幕 | 夜夜揉揉日日人人青青一国产精品| 丝袜美腿av在线| 国产精品日韩久久久久| 久久日韩精品一区二区五区| 97超碰在线免费| 国产精品美女xx| 亚洲国产精品一区二区尤物区| 欧美xxxx性| 天天爱天天做天天操| 91麻豆精品国产91久久久久久 | crdy在线观看欧美| 欧美日韩精品一区| www.久久热.com| 免费99视频| 欧美一级淫片丝袜脚交| 香蕉久久一区二区不卡无毒影院| 国产免费久久| 成人51免费| 久草视频在线看| 日韩欧美亚洲天堂| 国产精品视频中文字幕91| 久久成人精品一区二区三区| a级黄色片网站| 日本丰满少妇一区二区三区| 秋霞成人午夜鲁丝一区二区三区| 亚洲h色精品| 中文在线天堂库| 国产精品大片wwwwww| 亚洲精品视频免费看| 久久99精品久久久久久园产越南| 8x8x8x视频在线观看| 97av在线视频| 亚洲综合免费观看高清完整版在线| 久久精品论坛| 女生裸体视频网站免费观看| 国产脚交av在线一区二区| 一区二区三区四区在线免费观看| 九九久久婷婷| 奇米影视888狠狠狠777不卡| 亚洲字幕一区二区| 欧美精品粉嫩高潮一区二区| 青椒成人免费视频| 国产一区二区色噜噜| 国产三级日本三级在线播放| 国产成人精品一区二区| 第一福利永久视频精品| 亚洲伦伦在线| 亚洲涩涩在线| 亚洲老女人av| 成人免费观看a| 欧美一二三区在线观看| 国产精品一区二区久久精品爱涩| 日韩毛片免费看| 国产专区中文字幕| 亚洲一区二区中文| 亚洲国产免费av| 国产日产精品一区| 天天综合久久| av今日在线| 一区二区在线观| 丰满的少妇愉情hd高清果冻传媒| **毛片在线网站| www.亚洲免费| 蜜臀久久精品| 日韩激情欧美|