如何在java中獲取執行緒非同步執行之後的結果
阿新 • • 發佈:2019-02-03
java中提供了Future<V>介面和實現了Future介面的FutureTask<V> 類來將執行緒執行之後的結果返回(通過get()方法)。
1.Future<V>介面
Runnable介面執行任務是不返回任何值的,Runnable的run()方法的執行結果是void,而Future介面的call方法是有返回結果的,這是Runnable跟Future的區別之一,它們的另一個不同之處就是實現了Runnable介面的任務執行是呼叫ExecutorService的execute(Runnable task)方法,而實現了Future介面的任務是呼叫ExecutorService的submit(Future task)方法。呼叫Future的get()方法就能直接得到任務的返回值,該方法會一直阻塞直到任務的結果出來為止,我們可以呼叫Future的isDone()方法來判斷該任務的結果是否準備就緒。
2.FutureTask類 FutureTask實現了Future介面,將一個Callable例項作為引數傳給它,就能建立一個FutureTask例項,然後用ExecutorService的submit方法來執行這個例項。最後同樣是用get方法獲取執行緒執行後的結果。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 TestFuture { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executor = Executors.newCachedThreadPool(); Future result1 = executor.submit(new Callable() { @Override public Integer call() throws Exception { int sum = 0; for (int i = 0; i < 10; i++) { sum += i; } return sum; } }); Future result2 = executor.submit(new Callable() { @Override public Integer call() throws Exception { int sum = 0; for (int i = 10; i < 100; i++) { sum += i; } return sum; } }); executor.shutdown(); System.out.println(result1.get() + result2.get()); } }
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; public class TestFutureTask { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executor = Executors.newCachedThreadPool(); Callable task = new Callable() { @Override public String call() throws Exception { return "結果"; } }; FutureTask ft = new FutureTask(task); executor.submit(ft); System.out.println(ft.get()); executor.shutdown(); } }empty