當前位置:編程學習大全網 - 源碼下載 - 用java SWT做迅雷項目時線程老卡死怎麽辦?求具體實例

用java SWT做迅雷項目時線程老卡死怎麽辦?求具體實例

swt執行線程

SWT中的多線程機制和awt/swing中有些不同,這個大家應該都知道,不過還是要說下,Display對象中負責調用其他線程的方法有以下3種:● asyncExec(Runnable runnable):異步啟動新的線程。所謂異步就是,UI線程不會等待runnable對象執行結束後再繼續進行,就是說UI線程可以和runnable對象所在的線程同時運行。● syncExec(Runnable runnable):同步啟動新的線程。所謂同步就是,UI線程會等待runnable對象執行結束後才會繼續進行,當runnable對象是耗時大的線程時,盡量不要采用此種方式。另外,對於該種方式創建的線程可通過getSyncThread()方法獲得線程對象。● timerExec(int milliseconds,Runnable runnable):指定壹段時間再啟動新的線程。用此方法創建的線程,將會在指定的時間後再啟動線程。當然用此方法創建的線程啟動後,與UI線程是異步的。如果指定的時間為負數,將不會按時啟動線程。另外Display對象中,與UI線程相關的方法如下所示:● 獲得當前的UI線程對象的方法:getThread(),返回Thread對象。● 使UI線程處於休眠狀態:sleep()。● 喚醒UI線程:wake()。上面幾點都是書裏面的原話,不做闡述了.下面我要說的是壹個寫法的問題,不能小瞧啊,後果很嚴重.如果有壹個線程他要做的事需要很久比如5分鐘,像我這樣的初學swt的人壹定是new了壹個線程然後getDisplay().asyncExec(線程對象); 結果雖然執行成功,但是界面確處於掛起狀態(假死),直到執行結束,不過要說的是的確是異步執行的,還是ui卻不知道為什麽停止用戶響應,原理暫時先不去理了,swt源碼太復雜了.這裏面就要引出壹個問題為什麽不 像下面這麽寫呢?Thread thread = new Thread(線程對象);

thread.start();

因為swt中非UI線程中調用窗口控件如果不像上面三種寫法那樣寫的話,會拋org.eclipse.swt.SWTException: Invalid thread access這個異常在swt中程序啟動時只有壹個主線程,在這裏與awt和swing是不壹樣的,它不允許其他線程訪問UI主線程中的部件,具讀過swt源碼的人說AsyncExec方法根本就沒有新啟動壹個線程而是由Synchronizer調用其中的 run 方法而已.如果是這樣的話,也就難怪UI會掛起.解決這個問題的壹個比較好的方法是如果要異步執行的線程所做的工作非常少的話,就無所謂了,如果異步線程需要執行很長時間的話,應該像下面這樣啟動線程Thread thread = new Thread(線程對象);

thread.start();在線程對象裏面所有調用到UI部件的地方classFinder.getGui().getDisplay().syncExec(new Runnable() {

public void run() {

//do run

}

});歷經幾個小時問題終於解決了這裏做個總結吧.我對swt多線程的評價swt的syncExec ,asyncExec 以及timerExec都是偽線程執行方法,把它看成特別的Synchronizer調用就可以了,syncExec ,asyncExec 以及timerExec執行的線程要做的事只是改變UI部件的屬性而已執行時間不能太長.此外的其他操作仍然由傳統的線程來做.這裏要特別註意,swt執行線程只用於在傳統線程中操作ui組建在這裏要感謝內部類,否則壹個復雜的swt線程不知道要寫多少個為swt部件服務的標準類

  • 上一篇:《潛行狙擊》裏鞏sir是臥底嗎?結局是怎樣?
  • 下一篇:湘潭市教育考試院電話 考研
  • copyright 2024編程學習大全網