自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Swing線程解決方案

開發(fā) 后端
本文闡述了如何在開發(fā)Swing應(yīng)用中使用事件驅(qū)動(dòng)編程,以大大簡(jiǎn)化開發(fā)、維護(hù),并提供高靈活性。

不正確的Swing線程是運(yùn)行緩慢、無響應(yīng)和不穩(wěn)定的Swing應(yīng)用的主要原因之一。這是許多原因造成的,從開發(fā)人員對(duì)Swing單線程模型的誤解,到保證正確的線程執(zhí)行的困難。即使對(duì)Swing線程進(jìn)行了很多努力,應(yīng)用線程邏輯也是很難理解和維護(hù)的。本文闡述了如何在開發(fā)Swing應(yīng)用中使用事件驅(qū)動(dòng)編程,以大大簡(jiǎn)化開發(fā)、維護(hù),并提供高靈活性。

既然我們是要簡(jiǎn)化Swing應(yīng)用的線程,首先讓我們來看看 Swing線程是怎么工作的,為什么它是必須的。Swing API是圍繞單線程模型設(shè)計(jì)的。這意味著Swing組件必須總是通過同一個(gè)線程來修改和操縱。為什么采用單線程模型,這有很多原因,包括開發(fā)成本和同步 Swing的復(fù)雜性--這都會(huì)造成一個(gè)遲鈍的API。為了達(dá)到單線程模型,有一個(gè)專門的線程用于和Swing組件交互。這個(gè)線程就是大家熟知的Swing線程,AWT(有時(shí)也發(fā)音為“ought”)線程,或者事件分派線程。在本文的下面的部分,我選用Swing線程的叫法。
既然Swing線程是和 Swing組件進(jìn)行交互的唯一的線程,它就被賦予了很多責(zé)任。所有的繪制和圖形,鼠標(biāo)事件,組件事件,按鈕事件,和所有其它事件都發(fā)生在Swing線程。因?yàn)镾wing線程的工作已經(jīng)非常沉重了,當(dāng)太多其它工作在Swing線程中進(jìn)行處理時(shí)就會(huì)發(fā)生問題。會(huì)引起這個(gè)問題的最常見的位置是在非Swing處理的地方,像發(fā)生在一個(gè)事件監(jiān)聽器方法中,比如JButton的ActionListener,的數(shù)據(jù)庫查找。既然ActionListener的 actionPerformed()方法自動(dòng)在Swing線程中執(zhí)行,那么,數(shù)據(jù)庫查找也將在Swing線程中執(zhí)行。這將占用了Swing的工作,阻止它處理它的其它任務(wù)--像繪制,響應(yīng)鼠標(biāo)移動(dòng),處理按鈕事件,和應(yīng)用的縮放。用戶以為應(yīng)用死掉了,但實(shí)際上并不是這樣。在適當(dāng)?shù)木€程中執(zhí)行代碼對(duì)確保系統(tǒng)正常地執(zhí)行非常重要。

既然我們已經(jīng)看到了在適當(dāng)?shù)木€程中執(zhí)行Swing應(yīng)用的代碼是多么重要,現(xiàn)在讓我們?nèi)绾螌?shí)現(xiàn)這些線程。我們看看將代碼放入和移出Swing線程的標(biāo)準(zhǔn)機(jī)制。在講述過程中,我將突出幾個(gè)和標(biāo)準(zhǔn)機(jī)制有關(guān)的問題和難點(diǎn)。正如我們看到的,大部分的問題都來自于企圖在異步的Swing線程模型上實(shí)現(xiàn)同步的代碼模型。從那兒,我們將看到如何修改我們的例子到事件驅(qū)動(dòng)--移植整個(gè)方式到異步模型。
通用Swing線程解決方案

讓我們以一個(gè)最常用的Swing線程錯(cuò)誤開始。我們將企圖使用標(biāo)準(zhǔn)的技術(shù)來修正這個(gè)問題。在這個(gè)過程中,我們將看到實(shí)現(xiàn)正確的Swing線程的復(fù)雜性和常見困難。并且,注意在修正這個(gè)Swing線程問題中,許多中間的例子也是不能工作的。在例子中,我在代碼失敗的地方以//broken開頭標(biāo)出。好了,現(xiàn)在,讓我們進(jìn)入我們的例子吧。

假設(shè)我們?cè)趫?zhí)行圖書查找。我們有一個(gè)簡(jiǎn)單的用戶界面,包括一個(gè)查找文本域,一個(gè)查找按鈕,和一個(gè)輸出的文本區(qū)域。不要批評(píng)我的UI設(shè)計(jì),這個(gè)確實(shí)很丑陋,我承認(rèn)。

用戶輸入書的標(biāo)題,作者或者其它條件,然后顯示一個(gè)結(jié)果的列表。下面的代碼例子演示了按鈕的ActionListener在同一個(gè)線程中調(diào)用 lookup()方法。在這些例子中,我使用了thread.sleep()休眠5秒來作為一個(gè)占位的外部查找。線程休眠的結(jié)果等同于一個(gè)耗時(shí)5秒的同步的服務(wù)器調(diào)用。

  1. private void searchButton_actionPerformed()  
  2. {  
  3.  outputTA.setText("Searching for: " + searchTF.getText());  
  4.  //Broken!! Too much work in the Swing  
  5.  thread String[] results = lookup(searchTF.getText());  
  6.  outputTA.setText("");  
  7.  for (int i = 0; i < results.length; i++)  
  8.  {  
  9.   String result = results[i];  
  10.   outputTA.setText(outputTA.getText() + ´´ ´´ + result);  
  11.   }  
  12. }  

【編輯推薦】

  1. 淺析Swing線程包括內(nèi)容
  2. AWT或Swing混合環(huán)境中的事務(wù)處理
  3. Swing性能和Swing程序的學(xué)習(xí)
  4. 比較Swing和SWT的速度
  5. 淺談Swing構(gòu)造JList
責(zé)任編輯:佚名 來源: 機(jī)械工業(yè)出版社
相關(guān)推薦

2009-09-14 19:39:14

批量線程同步

2018-12-03 12:13:21

Mellanox解決方案

2018-12-03 12:26:30

YADRO解決方案

2018-12-03 11:59:42

Inventec解決方案

2012-05-27 16:21:31

IDC華為

2018-12-03 12:17:27

Semptian解決方案

2012-05-18 11:17:58

Java多線程

2016-03-13 17:58:57

2021-05-17 07:51:44

SimpleDateF線程安全

2016-03-13 17:35:18

2010-12-24 12:51:36

2011-05-05 15:36:25

深信服廣域網(wǎng)加速

2012-05-28 13:30:00

華為SmartCDN

2009-03-05 10:38:00

2010-10-21 21:53:46

IMOSIP多媒體H3C

2010-12-24 13:05:22

2011-12-09 11:13:17

2009-12-23 21:06:47

統(tǒng)一通信多媒體聯(lián)絡(luò)中心平臺(tái)華為

2017-08-02 17:23:22

AzureIoTAWS

2018-12-03 12:04:10

Kyligence解決方案
點(diǎn)贊
收藏

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