国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java Callable與Future的詳解及實例

2019-11-26 13:14:00
字體:
來源:轉載
供稿:網友

java  Callable與Future

Callable與 Future 兩功能是Java在后續版本中為了適應多并法才加入的,Callable是類似于Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其他線程執行的任務。

Callable的接口定義如下;

public interface Callable<V> {    V  call()  throws Exception; <span id="transmark"></span>} 

Callable和Runnable的區別如下:

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

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

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();  }}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灵石县| 海口市| 沙湾县| 蓬莱市| 赫章县| 河东区| 玉屏| 辉县市| 游戏| 木兰县| 新兴县| 东乡族自治县| 兰坪| 北票市| 棋牌| 大石桥市| 上栗县| 东港市| 彭阳县| 镇远县| 乳山市| 盐山县| 巩义市| 玛多县| 同心县| 河津市| 宝山区| 策勒县| 黔东| 扎赉特旗| 中卫市| 奇台县| 沿河| 雅江县| 金川县| 东兴市| 闽清县| 台南市| 海兴县| 通州市| 云阳县|