一、簡介
默認的異步任務有些難以控制,有時候我們希望在當前線程獲取異步任務的結果。FutureTask可以幫助我們實現
JDK文檔:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/FutureTask.html
FutureTask實現了RunnableFuture接口,而RunnableFuture接口繼承了Runnable和Future。
同時,FutureTask接收一個Callable接口的實現類構造實例,在Runnable的run方法被執行的時候會去調用Callable的call方法,然后將處理結果set到輸出對象里面去。
Future的get方法,將獲取該輸出值,作為異步線程的返回結果。
二、代碼示例
以下代碼,我們創建了FutureTask實例,然后將它丟給一個線程去執行。
再調用get方法阻塞等待異步結果,異步線程執行futureTask以后,返回結果。get方法獲取結果以后,停止阻塞狀態,打印結果。
import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class FutureTaskDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<String> futureTask = new FutureTask<>(() -> { System.out.println("future task is called"); Thread.sleep(2000); return "futureTask is done"; }); new Thread(futureTask).start(); System.out.println(futureTask.get()); } }