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

Swing任務在Swing線程中執行

開發 后端
本文介紹Swing任務在Swing線程中執行,介紹那些奇怪的并發代碼塊中的一個,下面將把它編寫到一個方法中使其能夠真正執行。

Swing任務在Swing線程中執行

界面顯示了一個null,因為顯示代碼在查找代碼完成前被處理了。這是因為一旦新的線程啟動了,代碼塊繼續執行,而不是等待線程執行完畢。這是那些奇怪的并發代碼塊中的一個,下面將把它編寫到一個方法中使其能夠真正執行。

在 SwingUtilities類中有兩個方法可以幫助我們解決這些問題:invokerLater()和invokeAndWait()。每一個方法都以一個Runnable作為參數,并在Swing線程中執行它。invokeAndWait()方法阻塞直到Runnnable執行完畢;invokeLater()異步地執行Runnable。invokeAndWait()一般不贊成使用,因為它可能導致嚴重的線程死鎖,對你的應用造成嚴重的破壞。所以,讓我們把它放置一邊,使用invokeLater()方法。

要修正最后一個變量變量scooping和執行順序的問題,我們必須將文本區域的getText()和setText()方法調用移入一個Runnable,只有在查詢結果返回后再執行它,并且使Swing任務在Swing線程中執行。我們可以這樣作,創建一個匿名Runnable傳遞給invokeLater(),包括在新線程的Runnable后的文本區域操作。這保證了 Swing代碼不會在查找結束之前執行。下面是修正后的代碼:

  1. privatevoidsearchButton_actionPerformed(){  
  2. outputTA.setText("Searchingfor:"+  
  3. searchTF.getText());  
  4. finalString[][]results=newString[1][1];  
  5. newThread(){  
  6. publicvoidrun(){  
  7. //getresults.  
  8. results[0]=lookup(searchTF.getText());  
  9. //sendrunnabletotheSwingthread  
  10. //therunnableisqueuedafterthe  
  11. //resultsarereturned  
  12. SwingUtilities.invokeLater(  
  13. newRunnable(){  
  14. publicvoidrun(){  
  15. //Nowwe'reintheSwingthread  
  16. outputTA.setText("");  
  17. for(inti=0;  
  18. i<results[0].length;  
  19. i++){  
  20. Stringresult=results[0][i];  
  21. outputTA.setText(  
  22. outputTA.getText()+  
  23. ''+result);  
  24. }  
  25. }  
  26. }  
  27. );  
  28. }  
  29. }.start();  
  30. }  

這可以工作,但是這樣做令人非常頭痛。我們不得不對通過匿名線程執行的順序,我們還不得不處理困難的scooping問題。問題并不少見,并且,這只是一個非常簡單的例子,我們已經遇到了作用域,變量傳遞,和執行順序等一系列問題。相像一個更復雜的問題,包含了幾層嵌套,共享的引用和指定的執行順序。這種方法很快就失控了。
問題

我們在企圖強制通過異步模型進行同步執行--企圖將一個方形的螺栓放到一個圓形的空中。只有我們嘗試這樣做,我們就會不斷地遭遇這些問題。從我的經驗,可以告訴你這些代碼很難閱讀,很難維護,并且易于出錯。

這看起來是一個常見的問題,所以一定有標準的方式來解決,對嗎?出現了一些框架用于管理Swing的復雜性,所以讓我們來快速預覽一下它們可以做什么。

一個可以得到的解決方案是Foxtrot,一個由Biorn Steedom寫的框架,可以在SourceForge上獲取。它使用一個叫做Worker的對象來控制非Swing任務在非 Swing線程中的執行,阻塞直到非Swing任務執行完畢。它簡化了Swing線程,允許你編寫同步代碼,并在Swing線程和非Swing線程直接切換。下面是來自它的站點的一個例子:

  1. publicvoidactionPerformed(ActionEvente)  
  2. {  
  3. button.setText("Sleeping...");  
  4. Stringtext=null;  
  5. try  
  6. {  
  7. text=(String)Worker.post(newTask()  
  8. {  
  9. publicObjectrun()throwsException  
  10. {  
  11. Thread.sleep(10000);  
  12. return"Slept!";  
  13. }  
  14. });  
  15. }  
  16. catch(Exceptionx)...  
  17. button.setText(text);  
  18. somethingElse();  
  19. }  

注意它是如何解決上面的那些問題的。我們能夠非常容易地在Swing線程中傳入傳出變量。并且,代碼塊看起來也很正確--先編寫的先執行。但是仍然有一些問題障礙阻止使用從準同步異步解決方案。Foxtrot中的一個問題是異常管理。使用Foxtrot,每次調用Worker必須捕獲Exception。這是將執行代理給Worker來解決同步對異步問題的一個產物。

同樣以非常相似的方式,我此前也創建了一個框架,我稱它為鏈接運行引擎(Chained Runnable Engine) ,同樣也遭受來自類似同步對異步問題的困擾。使用這個框架,你將創建一個將被引擎執行的Runnable的集合。每一個Runnable都有一個指示器告訴引擎是否應該在Swing線程或者另外的線程中執行。引擎也保證Runnable以正確的順序執行。所以Runnable #2將不會放入隊列直到Runnable #1執行完畢。并且,它支持變量以HashMap的形式從Runnable到Runnable傳遞。

表面上,它看起來解決了我們的主要問題。但是當你深入進去后,同樣的問題又冒出來了。本質上,我們并沒有改變上面描述的任何東西--我們只是將復雜性隱藏在引擎的后面。因為指數級增長的Runnable而使代碼編寫將變得非常枯燥,也很復雜,并且這些Runnable常常相互耦合。Runnable之間的非類型的HashMap變量傳遞變得難于管理。問題的列表還有很多。

在編寫這個框架之后,我意識到這需要一個完全不同的解決方案。這讓我重新審視了問題,看別人是怎么解決類似的問題的,并深入的研究了Swing的源代碼。

【編輯推薦】

  1. 介紹Swing線程相關處理
  2. 淺析Swing客戶端知識
  3. Swing線程解決方案
  4. 全面比較AWT和Swing
  5. 概述JSci.swing包的核心
責任編輯:佚名 來源: IT168
相關推薦

2009-07-16 09:54:44

LookupEventSwing線程

2009-07-14 15:34:22

Swing中的線程GUI程序

2009-04-30 09:10:42

JavaSwing線程安全

2009-07-15 18:06:38

Swing線程

2009-07-15 16:03:26

Swing線程

2009-07-15 17:09:32

Swing線程

2009-07-16 16:23:59

Swing線程

2009-07-16 11:19:48

外部線程Swing組件

2009-07-16 13:26:32

Swing增加

2009-07-14 11:30:15

Swing線程

2012-01-17 17:21:24

JavaSwing

2009-07-15 15:35:59

Swing程序Swing性能

2012-01-17 16:41:08

JavaSwing

2009-07-17 16:41:48

actionPerfoSwing

2009-07-17 16:49:18

lookandfeelSwing

2009-07-15 09:59:11

Metal觀感Swing

2009-07-10 10:19:57

JFormattedTSwing

2009-07-14 16:07:59

調用JavaFX代碼Swing程序

2010-05-24 14:04:48

JavaSwing多線程

2009-07-17 16:32:34

Timer對象Swing
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜不卡福利视频 | 91精品国产综合久久久久久丝袜 | 亚洲综合热 | 欧美专区在线 | 久久99一区二区 | 欧美另类视频 | 国产羞羞视频在线观看 | 97国产成人| 亚洲欧洲精品一区 | 欧美一二三四成人免费视频 | 美女国产| 午夜精品久久久 | av色站| 日韩视频在线观看中文字幕 | 亚洲永久入口 | 国产91久久精品一区二区 | 91成人小视频 | 国产综合在线视频 | 日韩一区二区三区精品 | 亚洲精品99 | 天堂在线一区 | 国产羞羞视频在线观看 | 97精品国产97久久久久久免费 | 国产日韩欧美 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 国产精品7777777 | 欧美成ee人免费视频 | 欧美日韩成人在线 | 国产中文字幕亚洲 | 日韩中文在线视频 | 亚洲精品欧美一区二区三区 | 欧美午夜精品久久久久免费视 | 羞羞涩涩在线观看 | 91久久精品国产免费一区 | 日本免费在线 | 一区二区三区视频免费观看 | 亚洲国产精品99久久久久久久久 | 国产四区 | 欧美亚洲国产一区二区三区 | 在线观看免费av网 | 日韩中文在线 |