Callable是一個泛型介面,也是一個FunctionalInterface,即函式式介面,它可以使用在Lambda運算式上,即現在比較流行的函式式編程,其實java8之后,封裝了好多函式式介面,今天說的Callable它是一個帶有回傳值的介面,它主要和Future一起使用,用在并行計算上;并行計算就是說,一個大任務,多個執行緒并發執行,這樣可以縮減程式運行的時間,當然前提是你要保持執行緒的安全性,
大任務實作類
/**
* 干一件不好干的事,使用Callable介面,需要 FutureTask實作類的支持,用于接收運算結果.
*/
class DoWork implements Callable<Integer> {
/**
* 需要處理的物件集合,每個執行緒傳遞自己的物件.
*/
List<String> list;
public DoWork(List<String> list) {
this.list = list;
}
@Override
public Integer call() throws Exception {
for (String s : list) {
System.out.println(Thread.currentThread().getId() + ":" + s);
}
Thread.sleep(3000);
return 1;
}
}
主方法中拆分大物件,呼叫大任務方法
@GetMapping("/do-fast")
public void doFast() throws InterruptedException, ExecutionException {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ExecutorService executor = Executors.newFixedThreadPool(2);
List<Future<Integer>> results = executor.invokeAll(asList(
new DoWork(Arrays.asList("a","b")), new DoWork(Arrays.asList("c","d"))
));
executor.shutdown();
//合并結果
for (Future<Integer> result : results) {
System.out.println(result.get());
}
stopWatch.stop();
System.out.println(stopWatch.getLastTaskTimeMillis());
}
如果不使用并行計算,這兩個方法執行應該是3秒+3秒=6秒,而使用了并行編程,它只有3秒左右

作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/296981.html
標籤:Java
