Callable與Future的介紹

Callable與 Future 兩功能是Java在後續版本中爲了適應多並法才加入的,Callable是相似於Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其餘線程執行的任務。java

Callable的接口定義以下;web

public interface Callable<V> { 異步

      V   call()   throws Exception; oop

this

Callable和Runnable的區別以下:spa

I    Callable定義的方法是call,而Runnable定義的方法是run。線程

II   Callable的call方法能夠有返回值,而Runnable的run方法不能有返回值。orm

III  Callable的call方法可拋出異常,而Runnable的run方法不能拋出異常。  對象

Future 介紹接口

Future表示異步計算的結果,它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。Future的cancel方法能夠取消任務的執行,它有一布爾參數,參數爲 true 表示當即中斷任務的執行,參數爲 false 表示容許正在運行的任務運行完成。Future的 get 方法等待計算完成,獲取計算結果

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

/**

 * Callable 和 Future接口

 * Callable是相似於Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它線程執行的任務。

 * Callable和Runnable有幾點不一樣:

 * (1)Callable規定的方法是call(),而Runnable規定的方法是run().

 * (2)Callable的任務執行後可返回值,而Runnable的任務是不能返回值的。

 * (3)call()方法可拋出異常,而run()方法是不能拋出異常的。

 * (4)運行Callable任務可拿到一個Future對象,

 * Future 表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。

 * 經過Future對象可瞭解任務執行狀況,可取消任務的執行,還可獲取任務執行的結果。

 */

public class CallableAndFuture {

    public static class  MyCallable  implements Callable{

          private int flag = 0; 

          public MyCallable(int flag){

                  this.flag = flag;

          }

          public String call() throws Exception{

              if (this.flag == 0){  

                      return "flag = 0";

            } 

            if (this.flag == 1){   

                try {

                    while (true) {

                            System.out.println("looping.");

                            Thread.sleep(2000);

                    }

                } catch (InterruptedException e) {

                              System.out.println("Interrupted");

                }

                return "false";

            } else {   

                       throw new Exception("Bad flag value!");

            }

        }

    }

    public static void main(String[] args) {

       // 定義3個Callable類型的任務

        MyCallable task1 = new MyCallable(0);

        MyCallable task2 = new MyCallable(1);

        MyCallable task3 = new MyCallable(2);

        

       // 建立一個執行任務的服務

        ExecutorService es = Executors.newFixedThreadPool(3);

        try {

           // 提交併執行任務,任務啓動時返回了一個Future對象,

            // 若是想獲得任務執行的結果或者是異常可對這個Future對象進行操做

            Future future1 = es.submit(task1);

           // 得到第一個任務的結果,若是調用get方法,當前線程會等待任務執行完畢後才往下執行

            System.out.println("task1: " + future1.get());

            

            Future future2 = es.submit(task2);

           // 等待5秒後,再中止第二個任務。由於第二個任務進行的是無限循環

            Thread.sleep(5000);

            System.out.println("task2 cancel: " + future2.cancel(true));

            

           // 獲取第三個任務的輸出,由於執行第三個任務會引發異常

            // 因此下面的語句將引發異常的拋出

            Future future3 = es.submit(task3);

            System.out.println("task3: " + future3.get());

        } catch (Exception e){

            System.out.println(e.toString());

        }

       // 中止任務執行服務

        es.shutdownNow();

    }

}

相關文章
相關標籤/搜索