[英]Using Future with ExecutorService
我需要並行執行兩個任務,然后等待它們完成。 另外,我需要第二項任務的結果,因為我正在使用Future
。
我的問題是我是否需要executor.awaitTermination
來加入任務,否則Future.get()
會照顧好它。 還有使用Java 8實現此目標的更好方法嗎?
public class Test {
public static void main(String[] args) {
test();
System.out.println("Exiting Main");
}
public static void test() {
System.out.println("In Test");
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> {
for(int i = 0 ; i< 5 ; i++) {
System.out.print("["+i+"]");
try {
Thread.sleep(1000);
} catch (Exception e) {e.printStackTrace();}
}
});
Future<String> result = executor.submit(() -> {
StringBuilder builder = new StringBuilder();
for(int i = 0 ; i< 10 ; i++) {
System.out.print("("+i+")");
try {
Thread.sleep(1000);
} catch (Exception e) {e.printStackTrace();}
builder.append(i);
}
return builder.toString();
});
System.out.println("shutdown");
executor.shutdown();
// DO I need this code : START
System.out.println("awaitTermination");
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
System.out.println("Error");
}
// DO I need this code : END
System.out.println("Getting result");
try {
System.out.println(result.get());
}
catch (InterruptedException e) {e.printStackTrace();}
catch (ExecutionException e) {e.printStackTrace();}
System.out.println("Exiting Test");
}
}
帶有awaitTermination的輸出:
In Test
[0]shutdown
(0)awaitTermination
[1](1)[2](2)[3](3)[4](4)(5)(6)(7)(8)(9)Getting result
0123456789
Exiting Test
Exiting Main
沒有awaitTermination的輸出:
In Test
[0]shutdown
Getting result
(0)[1](1)[2](2)[3](3)[4](4)(5)(6)(7)(8)(9)0123456789
Exiting Test
Exiting Main
從get
javadoc:
必要時等待計算完成,然后檢索其結果。
get
將僅等待第二個任務。
從awaitTermination
javadoc:
阻塞直到關閉請求后所有任務完成執行,或者發生超時,或者當前線程被中斷(以先發生的為准)。
awaitTermination
將等待所有任務。
您應該使用CompletableFuture
API
您可以運行一個異步過程,如下所示:
CompletableFuture.supplyAsync( () -> { ... } );
它返回一個future,您可以添加一個回調,該回調將在流程完成且結果可用時調用。
例如:
CompletableFuture.runAsync( () -> {
// Here compute your string
return "something";
} ).thenAccept( result -> {
// Here do something with result (ie the computed string)
} );
請注意,該語句在內部使用ForkJoinPool#commonPool()
執行異步過程,但是如果需要,您也可以使用自己的ExecutorService
調用此語句。 在這兩種情況下,為了確保在完成任務之前不退出,您需要在每個以后提交的任務上調用get()
(正在阻塞),或者等待執行程序關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.