Runnable、Callable和Future三者對比


Runnable是個借口,使用簡單:

  1. 實現該接口並重寫run方法

  2. 利用該類的對象創建線程

  3. 線程啟動時就會自動調用該對象的run方法
      通常在開發中結合ExecutorService使用,將任務的提交與任務的執行解耦開,同時也能更好地利用Executor提供的各種特性
Runnable接口:
public interface Runnable {
    public abstract void run();
}

缺點:

  1.Runnable接口不能拋出異常,只能內部消化;

  2.Runnable接口沒有返回值

注意:

  因為Java單繼承多實現,所以相對於集成Thread類,實現Runnable接口要更好。

線程池調用

ExecutorService executor = Executors.newCachedThreadPool();
                   executor.submit(new Runnable() { 
                        public void run() {
                               //TODO
                        }
                    });
executor.shutdown();

 

Callable接口

  與Runnable不同的是,Callable是個泛型參數化接口,並能返回線程的執行結果,且能在無法正常計算時拋出異常

public interface Callable<V> {
    V call() throws Exception;
}

1. Callable並不像Runnable那樣通過Thread的start方法就能啟動實現類的run方法,所以它通常利用ExecutorService的submit方法去啟動call方法自執行任務,

而ExecutorService的submit又返回一個Future類型的結果,因此Callable通常也與Future一起使用

ExecutorService pool = Executors.newCachedThreadPool();
     Future<String> future = pool.submit(new Callable{
           public void call(){
                   //TODO
           }
    });

Runnable與Callable不同點:

1. Runnable不返回任務執行結果,Callable可返回任務執行結果
2. Callable在任務無法計算結果時拋出異常,而Runnable不能
3. Runnable任務可直接由Thread的start方法或ExecutorService的submit方法去執行
 
Future
Future保存異步計算的結果,可以在我們執行任務時去做其他工作,並提供了以下幾個方法
* cancel(boolean mayInterruptIfRunning):試圖取消執行的任務,參數為true時直接中斷正在執行的任務,否則直到當前任務執行完成,成功取消后返回true,否則返回false
* isCancel():判斷任務是否在正常執行完前被取消的,如果是則返回true
* isDone():判斷任務是否已完成
* get():等待計算結果的返回,如果計算被取消了則拋出
* get(long timeout,TimeUtil unit):設定計算結果的返回時間,如果在規定時間內沒有返回計算結果則拋出TimeOutException
使用Future的好處:
1. 獲取任務的結果,判斷任務是否完成,中斷任務
1. Future的get方法很好的替代的了Thread.join或Thread,join(long millis)
2. Future的get方法可以判斷程序代碼(任務)的執行是否超時,如:
try{
      future.get(60,TimeUtil.SECOND);
 }catch(TimeoutException timeout){
      log4j.log("異常,將被取消!!");
      future.cancel();
 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM