非同期メソッドが終了しますまで、メインスレッドを待機する方法は?

ヤヌシュJ:

私が持っているService.classをstart()方法:

public void start()  {  
    for (int i = 0; i < companiesList.size(); i++) {
        asychronous.someAsynchronous(...);
    }
    log.info("Start method has finished");
}

私が持っているAsynchronous.classをsomeAsynchronous()方法:

@Async("threadPoolTaskExecutor")
public CompletableFuture<Void> someAsynchronous(some_parameters) {
    //do some stuff
    return null;
}

log.info()前のショーアップsomeAsynchronous()の方法が完了しました。待つように強制する方法log.info()まで、someSynchronous()ループ内のメソッドが終了しますか?ところで:非同期スレッドがまだループを終えた後で実行されています。

ニコラス:

CompletableFuture<Void>呼び出しが実行されるように要求されたが、それらのすべての後に、別のスレッドで、forループ仕上げを開始し、ログには、それらのいずれかが終了する前であっても印刷されています。これは、非同期処理の利点である-あなたはそれらの結果を気にしてどれだけ彼らが実行するのにかかった時間はありません。

あなたが望む達成するためには、定期的かどうかを確認する必要があり、すべてのログ・outoputに進む前に、それらのが終了しています。

// Adds executions to the List
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (int i = 0; i < companiesList.size(); i++) {
    futures.add(asychronous.someAsynchronous(...));
}

// Periodical check
Iterator<CompletableFuture<Void>> iterator = futures.iterator();
while (iterator.hasNext()) {
    CompletableFuture<Void> future = iterator.next(); // get the next one
    if (future.isDone()) {                            // if finished...
        //...                                         // ... do an action
        iterator.remove();                            // ... and remove from the Iterator
    }
    if (!iterator.hasNext()) {                        // if you reach the end
        iterator = futures.iterator();                // ... repeat the remaining Futures
    }
}

log.info("Start method has finished");

までは、この方法が完了していませんすべての死刑執行のが行われます。


編集:おかげ@Kayaman単一使用して提案全体の交換そのための専用Iteratorロジックを。futures配列でなければなりません。

// Adds executions to the List
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (int i = 0; i < companiesList.size(); i++) {
    futures.add(asychronous.someAsynchronous(...));
}

// Join the completion of all the threads
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();

log.info("Start method has finished");

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=404370&siteId=1