java多執行緒Future和Callable類的解釋與使用
阿新 • • 發佈:2019-01-30
一,描述
在多執行緒下程式設計的時候,大家可能會遇到一種需求,就是我想在我開啟的執行緒都結束時,同時獲取每個執行緒中返回的資料然後再做統一處理,在這樣的需求下,Future與Callable的組合就派上了很大的用場。也有人會說,我可以使用同步來完成這個需求啊,一般情況下確實可以。但是在一種特殊情況下就不行了:
想象,你開啟了多個執行緒同步計算一些資料,但是大家都知道,執行緒是會爭用資源的,也就是說,你開啟多個執行緒來同步計算資料時,其實執行緒之間的計算順序是不可空的,當然除非你非很大週摺去處理也不無可能,在這種情況下,Future和Callable的組合就是不二之選了。
二,例子
這兩個類的例子其實很簡單,主要就看自己在實際運用中能不能找到他們的用武之地了,上程式碼:
package test; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class FetureCallableTest { private static ExecutorService service = Executors.newFixedThreadPool(100); private static int count = 1; public static void main(String[] args) throws InterruptedException, ExecutionException { int sum = 0; for(int i = 0; i < 100; i++) { Future<Integer> future = service.submit(new Callable<Integer>(){ @Override public Integer call() throws Exception { System.out.println(Thread.currentThread().getName()); return ++count; } }); int f = future.get(); sum += f; System.out.println("future is " + f); } System.out.println("sum is " + sum); service.shutdownNow(); } }