本文分析了Eclipse中多線程程序的實現討論了在Eclipse客戶端程序開發中應用多線程的方法和要注意的問題同時也討論了多線程程序的一些調試和問題解決的方法
Eclipse作為一個開發平台使用越來越廣泛基於Eclipse Rich Client Platform開發的客戶端程序也越來越多在當今越來越復雜的應用環境中我們的客戶端程序不可避免的要同時進行多任務的處理一個優異的客戶端程序都會允許用戶同時啟動多個任務從而大大提高用戶的工作效率以及用戶體驗本文中我們來談談Eclipse中實現多任務的方式
在我們基於Eclipse的Java程序中我們有很多種方式提供多任務的實現熟悉Java的朋友立即會想到Java的Thread類這是Java中使用最多的一個實現多任務的類Eclipse平台為多任務處理提供了自己的API那就是Job以及UIJobEclipse中的Job是對Java Thread的一個封裝為我們實現多任務提供了更方便的接口以下是Job的基本用法
清單 Job用法示例
Job job = new Job(
Job Name
){
protected IStatus run(IProgressMonitor monitor) {
// 在這裡添加你的任務代碼
return Status
OK_STATUS;
}
};
job
schedule(delayTime);
在Eclipse中我們也會經常用到DisplayasynchExec() 和DisplaysynchExec()來啟動任務的執行這兩個方法主要為了方便我們完成界面操作的任務以下是DisplayasynchExec()的用法DisplaysynchExec()和它類似
清單 DisplaysynchExec()用法示例
Display
getDefault()
asyncExec(new Runnable() {
public void run() {
// 在這裡添加你的任務代碼
}
});
通常在Eclipse中我們最好使用Eclipse提供的Job接口來實現多任務而不是使用Java的thread為什麼呢?主要有以下幾個原因
Job是可重用的工作單元一個Job我們可以很方便的讓它多次執行 Job提供了方便的接口使得我們在處理中能夠很方便的與外界交流報告當前的執行進度 Eclipse提供了相應的機制使得程序員可以方便的介入Job的調度例如我們可以方便的實現每次只有一個同一類型的Job在運行 Eclipse缺省提供了Job管理的程序可以查看當前所有的Job和它們的進度也提供UI終止暫停繼續指定的Job 使用Job可以提高程序的性能節省線程創建和銷毀的開銷Eclipse中的Job封裝了線程池的實現當我們啟動一個Job時Eclipse不會馬上新建一個Thread它會在它的線程池中尋找是否有空閒的線程如果有空閒線程就會直接用空閒線程運行你的Job一個Job終止時它所對應的線程也不會立即終止它會被返回到線程池中以備重復利用這樣我們可以節省創建和銷毀線程的開銷 下面我們從幾個方面來討論Eclipse中Job的實現和使用方面的問題
Eclipse中Job的實現
Eclipse的核心包中提供了一個JobManager類它實現了IJobManager接口Eclipse中Job的管理和調度都是由JobManager來實現的 JobManager維護有一個線程池用來運行Job當我們調用Job的schedule方法後這個Job會被JobManager首先放到一個Job運行的等待隊列中去之後JobManager會通知線程池有新的Job加入了運行等待隊列線程池會找出一個空閒的線程來運行Job如果沒有空閒線程線程池會創建一個新的線程來運行Job一旦Job運行完畢運行Job的線程會返回到線程池中以備下次使用從上面Job運行的過程我們可以看到JobManager介入了一個Job運行的全過程它了解Job什麼時候開始什麼時候結束每一時候Job的運行狀態JobManager將這些Job運行的信息以接口的方式提供給用戶同時它也提供了接口讓我們可以介入Job的調度等從而我們擁有了更加強大的控制Job的能力
為了我們更方便的了解Job所處的狀態JobManager設置Job的一個狀態標志位我們可以通過Job的getState方法獲得Job當前的狀態值以了解其狀態
NONE當一個Job剛構造的時候Job就會處於這種狀態當一個Job執行完畢(包括被取消)後Job的狀態也會變回這種狀態 WAITING:當我們調用了Job的shedule方法JobManager會將Job放入等待運行的Job隊列這時Job的狀態為WAITING RUNNING:當一個Job開始執行Job的狀態會變為RUNNING SLEEPING:當我們調用Job的sleep方法後Job會變成這一狀態當我們調用schudule方法的時候帶上延時的參數Job的狀態也會轉入這一狀態在這一段延時等待的時間中Job都處於這一狀態這是一種睡眠狀態Job在這種狀態中時不能馬上轉入運行我們可以調用Job的wakeup方法來將Job喚醒這樣Job又會轉入WAITING狀態等待運行
[] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27703.html