Eclipse中的UI線程
另外在Eclipse的線程處理中有一個UI線程的概念Eclipse程序中的主線程是一個特殊的線程程序啟動後會先執行這個線程也就是我們的main()函數所在的線程作為桌面應用程序我們的主線程主要負責界面的響應以及繪制界面元素所以通常我們也叫它UI線程
以下代碼編過SWT應用程序的讀者會非常熟悉它一般出現在main函數的結尾下面來仔細分析一下它的詳細情況
//當窗口未釋放時
while (!shellisDisposed()) {
//如果display對象事件隊列中沒有了等待的事件就讓該線程進入等待狀態
if (!displayreadAndDispatch())
displaysleep();
}
上面的程序實際上就是我們UI線程的處理邏輯當程序啟動後UI線程會讀取事件等待隊列看有沒有事件等待處理如果有它會進行相應處理如果沒有它會進入睡眠狀態如果有新的事件到來它又會被喚醒進行處理UI線程所需要處理的事件包括用戶的鼠標和鍵盤操作事件操作系統或程序中發出的繪制事件一般來說處理事件的過程也就是響應用戶操作的過程
一個好的桌面應用程序需要對用戶的操作作出最快的響應也就是說我們的UI線程必須盡快的處理各種事件從我們程序的角度來說在UI線程中我們不能進行大量的計算或者等待否則用戶操作事件得不到及時的處理通常如果有大量的計算或者需要長時間等待(例如進行網絡操作或者數據庫操作)時我們必須將這些長時間處理的程序單獨開辟出一個線程來執行這樣雖然後台運行著程序但也不會影響界面上的操作
除主線程之外的所有線程都是非UI線程在Eclipse程序中我們所有對界面元素的操作都必須放到UI線程中來執行否則會拋出Exception所以我們要區分出UI線程和非UI線程保證我們對UI的操作都在UI線程中執行
如何判斷當前線程是否UI線程: 你可以通過調用DisplaygetCurrent()來知道當前線程是否是UI線程如果DisplaygetCurrent()返回為空表示當前不是UI線程
Eclipse中使用線程的幾種典型情況
控制Job的並發運行 對於某些Job為了避免並發性問題我們希望同時只有一個這樣的Job在運行這時我們需要控制Job的並發運行在另一種情況下我們也需要控制Job的並發運行我們在程序中對於一個任務我們有可能會啟動一個Job來執行對於少量的任務來說這是可行的但是如果我們預測可能會同時有大量的任務如果每一個任務啟動一個Job我們同時啟動的Job就會非常多這些Job會侵占大量的資源影響其他任務的執行我們可以使用Job的rule來實現控制Job的並發執行簡單的我們可以通過下面的代碼實現我們先定義一個如下rule
private ISchedulingRule Schedule_RULE = new ISchedulingRule() {
public boolean contains(ISchedulingRule rule) {
return this
equals(rule);
}
public boolean isConflicting(ISchedulingRule rule) {
return this
equals(rule);
}
};
對於需要避免同時運行的Job我們可以將它們的rule設成上面定義的rule如
myjob
setRule(Schedule_RULE);
myjob
setRule(Schedule_RULE);
[] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27698.html