麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > Java > 正文

Java多線程之Callable接口的實(shí)現(xiàn)

2024-07-14 08:42:00
字體:
供稿:網(wǎng)友

1.接口的定義:

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

2.Callable和Runnable的異同

先看下Runnable接口的定義

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

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

3. Callable類型的任務(wù)可以有兩種執(zhí)行方式:

我們先定義一個(gè)Callable任務(wù)MyCallableTask:

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

①借助FutureTask執(zhí)行 

FutureTask類同時(shí)實(shí)現(xiàn)了兩個(gè)接口,F(xiàn)uture和Runnable接口,所以它既可以作為Runnable被線程執(zhí)行,又可以作為Future得到Callable的返回值。

借助FutureTask執(zhí)行的大體流程是:

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

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

②借助線程池來運(yùn)行 

線程池中執(zhí)行Callable任務(wù)的原型例如:

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

借助線程池來運(yùn)行Callable任務(wù)的一般流程為:

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

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

在網(wǎng)上看到了幾個(gè)比較好的代碼例子: 

a.Callable任務(wù)借助FutureTask運(yùn)行:

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任務(wù)和線程池一起使用,然后返回值是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.當(dāng)執(zhí)行多個(gè)Callable任務(wù),有多個(gè)返回值時(shí),我們可以創(chuàng)建一個(gè)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任務(wù)未完成!");    }   }   exec.shutdown();  } }

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

①可以獲得任務(wù)執(zhí)行返回值; 

②通過與Future的結(jié)合,可以實(shí)現(xiàn)利用Future來跟蹤異步計(jì)算的結(jié)果。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产成人在线一区二区 | 亚洲国产在 | 91精品国产一区二区在线观看 | 国产精品久久久免费 | 日本成年免费网站 | 草草视频在线 | 国产精品美女一区二区 | 51国产偷自视频区视频小蝌蚪 | 男女一边摸一边做羞羞视频免费 | 91网站链接 | 欧美一级高潮 | 国产人成精品综合欧美成人 | 91精品国产91久久久久久不卞 | 香蕉黄色网 | 把娇妻调教成暴露狂 | 2021av视频 | 国产精品久久av | 高清成人在线 | 国产免费一级 | 亚洲电影免费观看国语版 | 思思久而久而蕉人 | 国产精选电影免费在线观看 | 国产亚洲精品综合一区91 | 日本一区免费看 | 亚洲人成在线播放 | 欧美日在线观看 | 国产免费传媒av片在线 | 性 毛片| 日本高清com | 成人三级电影网站 | av之家在线观看 | 黄色大片网站在线观看 | 国产亚洲精品久久久久久久 | 精品一区二区三区欧美 | 黄色影院av| 狠狠色噜噜狠狠狠米奇9999 | 成人视屏在线观看 | 久久综合精品视频 | 日本最新免费二区三区 | 国产成年人网站 | 午夜在线视频观看 |