Job使用中要注意的問題
不要在Job中使用Threadsleep方法如果你想要讓Job進入睡眠狀態最好用Job的sleep方法雖然使用Threadsleep和Job的sleep方法達到的效果差不多但是它們實現的方式完全不同對系統的影響也不一樣我們知道Eclipse中Job是由Eclipse的JobManager來管理的如果我們調用Job的sleep方法JobManager會將Job轉入睡眠狀態與其對應的線程也會重新放入線程池等待運行其他Job而如果我們在Job中直接調用Threadsleep方法它會直接使運行Job的線程進入睡眠狀態其他Job就不可能重用這個線程了同時雖然運行該Job的線程進入了睡眠狀態Job的狀態還是Running(運行狀態)我們也不能用Job的wakeup方法喚醒該Job了 Job的取消一般我們會直觀的認為一旦調用Job的cancel方法Job就會停止運行實際上這並不一定正確當Job處於不同的狀態時我們調用Job的cancel方法所起的效果是不同的當Job在WAITING狀態和SLEEPING狀態時一旦我們調用cancel方法JobManager會將Job直接從等待運行的隊列中刪除Job不會再運行了這時cancel方法會返回true但是如果Job正在運行cancel方法調用並不會立即終止Job的運行它只會設定一個標志指明這個Job已經被取消了我們可以使用Job的run方法傳入的參數IProgressMonitor monitor這個參數的isCanceled方法會返回Job是否被取消的狀態如果需要我們必須在我們的代碼的適當位置檢查Job是否被取消的標志作出適當的響應另外由於調用Job的cancel方法不一定立即終止Job如果我們需要等待被取消的Job運行完再執行我們可以用如下代碼
if (!job
cancel())
job
join();
Join方法的使用由於join方法會導致一個線程等待另一個線程一旦等待線程中擁有一個被等待線程所需要的鎖就會產生死鎖當我們的線程中需要用到同步時這種死鎖的情況非常容易出現所以我們使用join時必須非常小心盡量以其他方法替代 避免過時的Job造成的錯誤由於我們啟動的線程並不一定是馬上執行的當我們的Job開始運行時情況可能發生了變化我們在Job的處理代碼中要考慮到這些情況一種典型的情況是我們在啟動一個對話框或者初始化一個ViewPart時我們會啟動一些 Job去完成一些數據讀取的工作一旦數據讀取結束我們會啟動新的UI Job更新相應的UI有時用戶在打開對話框或者View後馬上關閉了該對話框或者View這時我們啟動的線程並沒有被中斷一旦在Job中再去更新UI就會出錯在我們的代碼中必須作相應的處理所以我們在線程中更新界面元素之前我們必須先檢查相應的控件是否已經被dispose了 結束語
在我們進行基於Eclipse的客戶端開發時使用多線程可以大大的提供我們的程序並發處理能力同時對於提高用戶體驗也有很好的幫助但是多線程程序也有其不利的一面我們也不要濫用線程
首先多線程程序會大大的提高我們程序的復雜度使得我們的開發和調試更加困難 其次過多的線程容易引發死鎖數據同步等並發問題的發生 另外由於線程創建和銷毀需要開銷程序的整體性能可能因為過多線程的使用而下降 所以我們在使用線程時一定要謹慎本文對Eclipse線程的討論希望能對大家使用線程有所幫助由於實際情況較為復雜文中所提到的方法僅供參考讀者對於不同的實際問題需要進行具體分析從而找出最佳的解決方案
[] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27702.html