中断をサポートしたい場合はjoin()
を使用しないでください。代わりにget()
を使用してください。インターフェースCompletionStage
から来
join()
get()
一方Future
join()
が中断される可能性がありますExecutionException
get()
でそれらをラップCompletionException
get()
一方で例外をラップしてから投げるでしょうフォームインタフェースに来る:基本的に彼らは除いて同じですInterruptedException
中断するものはFuture
ではなくThread
です。例えば、それはmyFuture.get()
で待っている間に、次のコードは、メインスレッドを中断:
CompletableFuture<Void> myFuture = new CompletableFuture<>();
Thread mainThread = Thread.currentThread();
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(1000);
System.out.println("Interrupting…");
mainThread.interrupt();
Thread.sleep(1000);
System.out.println("Completing");
myFuture.complete(null);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
try {
myFuture.get();
System.out.println("Get succeeded");
} catch (Exception e) {
System.out.println("Get failed");
e.printStackTrace();
}
出力:あなたはjoin()
によってget()
を交換する場合
Interrupting…
Get failed
java.lang.InterruptedException
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:347)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at CompletableFutureInteruption.main(CompletableFutureInteruption.java:37)
…
、割り込みは実際に動作しません。
これはあなたが探しているものかどうか疑問に思っています。https://stackoverflow.com/questions/43389894/recursively-cancel-an-alloff-completablefuture/43391133#43391133 – Eugene
@Eugeneこのリンクをご利用いただきありがとうございます。私は 'CompletableFuture :: cancel'がスレッドを中断しないことを知っています。私がしたいのは、 'CompletableFuture :: join'オペレーションでブロックするスレッドを中断することです。たぶん私は私の質問をより明確に記述するべきでしょう。 – phil