乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      從swing分發(fā)線程機制上理解多線程 | i flym

       KILLKISS 2012-09-13

      本文參考了 http://space./13685345/viewspace-374940,原文作者:javagui
          在多線程編程當中,總會提到圖形編程,比如java中的swing,并一再提出,在swing中,一切都是單線程的。所有的界面更新操作都必須在排隊似地進行。這樣的目的在于,避免由于多線程的處理導致界面渲染以及組件排列異常,同時也避免了由于多線程帶來的加鎖訪問以及等待鎖的情況發(fā)生。

          EventQueue的派發(fā)機制由單獨的一個線程管理,這個線程稱為事件派發(fā)線程(EDT)”。和其他很多桌面API一樣,Swing將GUI請求放入一個事件隊列中執(zhí)行。
          這個可以這樣來理解,界面上所有的操作,包括點擊按鈕,編輯文字等。這些操作都會產(chǎn)生一系列的事件,而這些事件均按鈕一定的順序(通常是事件發(fā)生的順序)依次的插入到事件隊列中。而分線線程則按照順序從事件隊列中依次一個一個地取出事件對象,并調(diào)用事件的相應方法來運行處理事件的方法。
          在整個處理階段,分發(fā)線程必須要等到一個事件處理方法運行結(jié)束之后,才會處理下一個事件。在這個過程中,肯定有些事件處理得快,比如普通的點擊按鈕改變顏色的這種操作;而有些事件則會非常的慢,比如點擊按鈕運行一個長時間的數(shù)據(jù)壓縮。我們希望,處理得慢的事件在處理時不致于影響其它事件的處理。

          這就需要使用其它線程來處理這些耗時地任務,比如使用一個新的線程來處理這些耗時任務。這樣可以處理處理事件的程序快速地返回,而不至于影響其它事件的執(zhí)行。但是在處理過程中,我們必須保證處理的代碼不能影響到界面的變化。主要依賴于以下的原則:

          EDT要處理所有GUI操作,它是職責分明且非常忙碌的。也就是說你要記住兩條原則:一、職責分明,任何GUI請求都應該在EDT中調(diào)用。二、需要處理的GUI請求非常多,包括窗口移動、組件自動重繪、刷新,它很忙,所以任何與GUI無關(guān)的處理不要由EDT來負責,尤其是I/O這種耗時的操作。

          那么,如果我們要在我們新建的線程中,要調(diào)用界面處理程序應該如何去做呢。這時可以使用SwingUtilities工具類的invokeLater或者invokeAndWait方法來執(zhí)行界面更新程序。這兩個方法,是將我們傳遞的一個線程方法放入到事件分發(fā)線程當中,這樣可保證所有更新界面的程序都能夠在事件處理線程中運行。
          由于invokeLater和invokAndWait方法是在事件分發(fā)線程中運行的,所以這兩個方法不能在事件分發(fā)線程中調(diào)用,特別是invokeAndWait方法,這會導致線程死鎖。所幸的是,jdk的invokeAndWait實現(xiàn)避免了這種情況,如果在事件處理線程中調(diào)用invokeAndWait,那會產(chǎn)生一個異常。

          說到底,什么是事件處理線程呢,什么才算在事件處理線程當中呢。很簡單的理解,我們添加到各個對象上的listener實現(xiàn)中的處理代碼,都是在事件處理線程中運行的。比如按鈕的點擊事件處理程序,actionPerformed方法,這都是在事件處理線程中調(diào)用的。

          通過上述對事件隊列和EDT的分析,有這樣一種體會:事件隊列是一個非常好的處理并發(fā)設(shè)計模型,不僅 Swing用它來處理后臺,Java的很多地方都在用,只不過對于處理服務器端的并發(fā)請求有多個處理線程在等候處理請求,也就是常說的線程池。而對于單用戶的桌面應用,單線程調(diào)用要比多現(xiàn)成API更簡單,“Swing后臺這樣做是為了保證事件的順序和可預見性”,而且相對于服務器,客戶端桌面層的請求要少得多,所以單線程就足夠應對了。

          那么,swing的分發(fā)線程機制和多線程之間有什么聯(lián)系呢?swing中的線程處理原則在于,界面處理程序在事件處理線程中運行,而其它邏輯運算在其它線程中運行,通過invokeLator和invokeAndWait和事件處理線程交互。而我們通過使用的多線程,在一定程度上也是這樣處理。主要的程序處理在主線程中運行,當接收到處理請求時,則分發(fā)線程進行,即要保證主線程不會因為事件處理而被阻塞,同時也要保證事件都能夠被處理。比如經(jīng)常使用的web開發(fā)中的socket請求。

      轉(zhuǎn)載請標明出處:i flym
      本文地址:http://www./index.php/code/201108110001.html

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多