欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂Java培訓(xùn)之多線程實現(xiàn)Callable接口代碼示例

2018-08-13 15:33:27 1177瀏覽

今天扣丁學(xué)堂Java培訓(xùn)老師給大家介紹一下關(guān)于Java開發(fā)多線程之Callable接口的實現(xiàn),Callable和Runnbale一樣代表著任務(wù),區(qū)別在于Callable有返回值并且可以拋出異常,下面我們一起來看一下吧。



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

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

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

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

①借助FutureTask執(zhí)行

FutureTask類同時實現(xiàn)了兩個接口,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()的運行結(jié)果:futuretask.get();

②借助線程池來運行

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

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

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

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

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

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

a.Callable任務(wù)借助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任務(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í)行多個Callable任務(wù),有多個返回值時,我們可以創(chuàng)建一個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é)合,可以實現(xiàn)利用Future來跟蹤異步計算的結(jié)果。

以上就是扣丁學(xué)堂Java培訓(xùn)之多線程實現(xiàn)Callable接口代碼示例的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,想要了解更多關(guān)于Java開發(fā)內(nèi)容的小伙伴可以登錄扣丁學(xué)堂官網(wǎng)咨詢,扣丁學(xué)堂Java視頻教程讓學(xué)員免費觀看學(xué)習(xí),扣丁學(xué)堂Java技術(shù)交流群:670348138。

扣丁學(xué)堂微信公眾號


【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】


查看更多關(guān)于“Java開發(fā)資訊”的相關(guān)文章>>

標(biāo)簽: Java培訓(xùn) Java視頻教程 Java多線程 Java面試題 Java學(xué)習(xí)視頻 Java開發(fā)

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部