亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java多線程之Callable接口的實現

2024-07-14 08:42:00
字體:
來源:轉載
供稿:網友

1.接口的定義:

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

2.Callable和Runnable的異同

先看下Runnable接口的定義

public interface Runnable { public abstract void run();}

Callable的call()方法類似于Runnable接口中run()方法,都定義任務要完成的工作,實現這兩個接口時要分別重寫這兩個方法,主要的不同之處是call()方法是有返回值的(其實還有一些區別,例如call方法可以拋出異常,run方法不可以),運行Callable任務可以拿到一個Future對象,表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結果。通過Future對象可以了解任務執行情況,可取消任務的執行,還可獲取執行結果。

3. Callable類型的任務可以有兩種執行方式:

我們先定義一個Callable任務MyCallableTask:

class MyCallableTask implements Callable<Integer>{ @Override public Integer call() throws Exception {  System.out.println("線程在進行計算");  Thread.sleep(3000);  int sum = 0;  for(int i=0;i<100;i++)   sum += i;  return sum; }}

①借助FutureTask執行 

FutureTask類同時實現了兩個接口,Future和Runnable接口,所以它既可以作為Runnable被線程執行,又可以作為Future得到Callable的返回值。

借助FutureTask執行的大體流程是:

Callable<Integer> mycallabletask = new MyCallableTask(); FutureTask<Integer> futuretask= new FutureTask<Integer>(mycallabletask); new Thread(futuretask).start();

通過futuretask可以得到MyCallableTask的call()的運行結果: futuretask.get(); 

②借助線程池來運行 

線程池中執行Callable任務的原型例如:

public interface ExecutorService extends Executor { //提交一個Callable任務,返回值為一個Future類型 <T> Future<T> submit(Callable<T> task); //other methods... }

借助線程池來運行Callable任務的一般流程為:

 ExecutorService exec = Executors.newCachedThreadPool(); Future<Integer> future = exec.submit(new MyCallableTask());

通過future可以得到MyCallableTask的call()的運行結果: future.get(); 

在網上看到了幾個比較好的代碼例子: 

a.Callable任務借助FutureTask運行:

public class CallableAndFutureTask { public static void main(String[] args) {  Callable<Integer> callable = new Callable<Integer>() {   public Integer call() throws Exception {    return new Random().nextInt(100);   }  };  FutureTask<Integer> future = new FutureTask<Integer>(callable);  new Thread(future).start();  try {   Thread.sleep(5000);   System.out.println(future.get());  } catch (InterruptedException e) {   e.printStackTrace();  } catch (ExecutionException e) {   e.printStackTrace();  } }}

b.Callable任務和線程池一起使用,然后返回值是Future:

public class CallableAndFuture { public static void main(String[] args) {  ExecutorService threadPool = Executors.newSingleThreadExecutor();  Future<Integer> future = threadPool.submit(new Callable<Integer>() {   public Integer call() throws Exception {    return new Random().nextInt(100);   }  });  try {   Thread.sleep(5000);// 可能做一些事情   System.out.println(future.get());  } catch (InterruptedException e) {   e.printStackTrace();  } catch (ExecutionException e) {   e.printStackTrace();  } }}

c.當執行多個Callable任務,有多個返回值時,我們可以創建一個Future的集合,例如:

class MyCallableTask implements Callable<String> { private int id;  public OneTask(int id){   this.id = id;  }  @Override  public String call() throws Exception {   for(int i = 0;i<5;i++){   System.out.println("Thread"+ id);    Thread.sleep(1000);   }   return "Result of callable: "+id;  } }public class Test {  public static void main(String[] args) {   //Callable<String> mycallabletask = new MyCallableTask(1);   ExecutorService exec = Executors.newCachedThreadPool();   ArrayList<Future<String>> results = new ArrayList<Future<String>>();    for (int i = 0; i < 5; i++) {    results.add(exec.submit(new MyCallableTask(i)));   }   for (Future<String> fs : results) {    if (fs.isDone()) {     try {      System.out.println(fs.get());     } catch (Exception e) {      e.printStackTrace();     }    } else {     System.out.println("MyCallableTask任務未完成!");    }   }   exec.shutdown();  } }

 那么引入Callable接口具有哪些好處呢? 

①可以獲得任務執行返回值; 

②通過與Future的結合,可以實現利用Future來跟蹤異步計算的結果。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
少妇激情综合网| 久久久久久久香蕉网| 中文欧美日本在线资源| 欧美中文字幕在线播放| 久久青草精品视频免费观看| 91高清视频免费观看| 欧美日韩视频免费播放| 国产精品久久久久9999| 国产精品久久久久久久久久免费| 啪一啪鲁一鲁2019在线视频| 中文字幕日韩欧美在线| 久久久久久久影视| 欧美成人一二三| 亚洲欧美中文在线视频| 岛国av一区二区三区| 久久大大胆人体| 日韩视频第一页| 国产亚洲一区精品| 中文字幕9999| 欧美精品在线第一页| 18一19gay欧美视频网站| 国产精品久久久av| 国产精品第一视频| 少妇久久久久久| 亚洲精品国产精品乱码不99按摩| 欧美精品一区二区三区国产精品| 欧美性猛交xxxx黑人猛交| 精品国偷自产在线视频| 国产成人在线一区二区| 亚洲国产精久久久久久| 久久影院资源网| 91精品在线国产| 国产精品日韩欧美大师| 国产精品久久久久久久午夜| 日韩在线免费视频观看| 亚洲精品电影在线观看| 久久久www成人免费精品张筱雨| 色婷婷av一区二区三区久久| 96精品久久久久中文字幕| 国产成人精品一区二区在线| 在线中文字幕日韩| 久久视频这里只有精品| 亚洲国产精品高清久久久| 亚洲免费影视第一页| 国产成人精品亚洲精品| 懂色av一区二区三区| 亚洲国模精品一区| 色老头一区二区三区在线观看| 激情懂色av一区av二区av| 久久久在线视频| 久久这里只有精品99| 91精品国产自产在线观看永久| 一二美女精品欧洲| 欧美成人精品一区二区三区| 成人激情av在线| 欧美精品福利在线| 法国裸体一区二区| 欧美xxxx综合视频| 亚洲自拍av在线| 国产成人一区二区三区小说| 国产亚洲精品美女久久久| 欧美视频免费在线观看| 国精产品一区一区三区有限在线| 久久成人人人人精品欧| 91精品国产777在线观看| 色与欲影视天天看综合网| 国产精品成人一区二区三区吃奶| 久久青草福利网站| 国产亚洲欧洲在线| 久久久精品国产亚洲| 国产精品亚发布| 性色av一区二区三区| 欧美超级乱淫片喷水| 日本韩国欧美精品大片卡二| 日韩av快播网址| 欧美精品在线播放| 欧美在线一区二区三区四| 欧美性猛交丰臀xxxxx网站| 亚洲xxxx18| 成人激情在线播放| 国产精品人成电影| 久久久国产一区二区三区| 国产精品久久久久久久久久99| 秋霞av国产精品一区| 国产在线视频欧美| 欧美午夜精品在线| 亚洲性无码av在线| 一本色道久久88精品综合| 亚洲视频网站在线观看| 精品一区二区亚洲| 欧美日韩精品中文字幕| 国内精品免费午夜毛片| 日本久久久a级免费| 全色精品综合影院| 中文字幕在线视频日韩| 欧美日韩精品在线播放| 国产成人在线视频| 精品高清一区二区三区| 91精品国产91久久久久久不卡| 久久综合色影院| 热久久这里只有精品| 欧美成人自拍视频| 国产精品亚洲视频在线观看| 欧美激情精品久久久久久| 成人国产精品久久久久久亚洲| 奇米四色中文综合久久| 欧美乱大交做爰xxxⅹ性3| 伊人成人开心激情综合网| 欧美性生交大片免费| 欧美成aaa人片在线观看蜜臀| 性欧美xxxx交| 亚洲欧美日韩国产精品| 欧美www视频在线观看| 精品国产乱码久久久久久婷婷| 国产福利视频一区| 日韩中文字在线| 国产99视频在线观看| 操人视频在线观看欧美| 亚洲专区中文字幕| 91久久精品国产91久久| 亚洲欧美国产日韩天堂区| 色综合老司机第九色激情| 久久九九全国免费精品观看| 国产精品96久久久久久| 亚洲aⅴ男人的天堂在线观看| 午夜精品在线观看| 国产精品久久久久久一区二区| 78色国产精品| 久久成人精品一区二区三区| 亚洲一区av在线播放| 国产精品免费视频xxxx| 乱亲女秽乱长久久久| 欧美电影免费观看高清完整| 欧美在线日韩在线| 91牛牛免费视频| 成人疯狂猛交xxx| 欧美成人三级视频网站| 中文字幕欧美日韩在线| 亚洲成人精品视频| 国产91久久婷婷一区二区| 色妞一区二区三区| 日本韩国欧美精品大片卡二| 日韩精品中文字| 亚洲女人被黑人巨大进入al| 疯狂欧美牲乱大交777| 亚洲天堂av综合网| 亚洲成人网在线| 亚洲淫片在线视频| 中文字幕亚洲无线码a| 久久这里有精品视频| 欧美性生交大片免费| 亚洲精品自产拍| 精品国产一区二区三区在线观看| 久久久精品影院| 搡老女人一区二区三区视频tv| 亚洲精品国产成人| 91亚洲va在线va天堂va国| 国产精品欧美亚洲777777| 亚洲美女性视频| 国产精品狼人色视频一区| 欧美激情在线观看| 欧美日韩精品在线视频| 亚洲xxx视频| 2018国产精品视频|