Future
一、簡介
通常情況下,我們在寫多線程任務時,都是實作run方法,大家注意到run方法是沒有傳回值的。如果我們要用到其他線程的傳回值該怎麼辦呢?
這裡就要用到Future了。
Future是通過Callable實作的,是一種可生成結果的Runnable。當運作完成以後,可以通過Future.get擷取結果。
Future.get取決于任務的狀态,如果任務沒有完成,則get方法一直阻塞,直到任務完成。
下面來看具體的執行個體
二、執行個體
public class Ha {
public static void main(String[] args) throws InterruptedException, ExecutionException {
Callable<String> callable = () -> {
System.out.println("分線程正在進行");
Thread.sleep(10*1000);
System.out.println("分線程結束");
return "分線程完成";
};
ExecutorService es = Executors.newSingleThreadExecutor();
Future<String> future = es.submit(callable);
es.shutdown();
System.out.println("主線程工作正在進行");
Thread.sleep(5*1000);
System.out.println("主線程工作結束");
String result = future.get();
System.out.println(result);
}
}
首先,我們實作Callable,模拟一個工作任務,執行時間是10秒。
通過Executors建立一個單線程任務,并執行Callable。
主線程繼續自己的工作,工作時間是5秒。
主線程擷取分線程的任務結果,由于分線程任務是10秒,是以get方法會阻塞,直到分線程任務完成。
最後列印分線程任務結果。
執行結果如下:
- 主線程工作正在進行
- 分線程正在進行
- 主線程工作結束
- 分線程結束
- 分線程完成
上面的例子中,使用了lambda表達式,如果要運作,請使用jdk8。