這樣對於myjob和myjob這兩個Job它們不會再同時執行Myjob會等待myjob執行完再執行這是由Eclipse的JobManager來提供實現的JobManager可以保證所有啟動的Job中任意兩個Job的rule是沒有沖突的我們在上面定義的rule是最簡單的我們可以重寫isConflicting函數來實現一些更加復雜的控制比如控制同時同類型的Job最多只有指定的個數在運行但是我們要注意isConflicting方法不能過於復雜一旦一個Job的rule與其他Job的rule有沖突isConflicting方法會調用很多次如果其中的計算過於復雜會影響整體的性能
根據需要執行Job 由於我們有的Job有可能不是立即執行的在有些情況下等到該Job准備執行的時候該Job所要執行的任務已經沒有意義了這時我們可以使用Job的shouldSchedule()和shouldRun()來避免Job的運行在我們定義一個Job時我們可以重載shouldSchedule和shouldRun方法在這些方法中我們可以檢查Job運行的一些先決條件如果這些條件不滿足我們就可以返回falseJobManager在安排Job運行時它會先調用該Job的shouldSchedule方法如果返回為falseJobManager就不會再安排這個Job運行了同樣JobManager在真正啟動一個線程運行一個Job前它會調用該Job的shouldRun方法如果返回false它不再運行這個Job在下面的例子中我們希望啟動一個Job在十秒鐘之後更新文本框中的內容為了保證我們的Job運行時是有意義的我們需要確保我們要更新的文本框沒有被銷毀我們重載了shouldSchedule和shouldRun方法
Text text = new Text(parentSWTNONE);
UIJob refreshJob = new UIJob(更新界面){
public IStatus runInUIThread(IProgressMonitor monitor) {
textsetText(新文本);
return StatusOK_STATUS;
}
public boolean shouldSchedule(){
return !textisDisposed();
}
public boolean shouldRun(){
return !textisDisposed();
}
};
refreshJobschedule();
在UI線程中涉及長時間處理的任務 我們經常碰到這樣一種情況用戶操作菜單或者按鈕會觸發查詢大量數據數據查詢完後更新表格等界面元素用戶點擊菜單或者按鈕所觸發的處理程序一般處於UI線程為了避免阻塞UI我們必須把數據查詢等費時的工作放到單獨的Job中執行一旦數據查詢完畢我們又必須更新界面這時我們又需要使用UI線程進行處理下面是處理這種情況的示例代碼
buttonaddSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e){
perform();
}
public void widgetDefaultSelected(SelectionEvent e){
perform();
}
private void perform(){
Job job = new Job(獲取數據){
protected IStatus run(IProgressMonitor monitor){
// 在此添加獲取數據的代碼
DisplaygetDefault()asyncExec(new Runnable(){
public void run(){
// 在此添加更新界面的代碼
}
});
}
};
jobschedule();
}
});
[] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27699.html