ヤヌシュ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");