簡體   English   中英

在ExecutorService中使用Future

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM