CompletableFutureのドキュメントは、非同期実行のために次の動作を指定します。CompletableFutureは
それはサポートしていない場合を除き、明示的なキュータ引数なしですべての非同期方法がForkJoinPool#commonPoolを()(使用して実行されています少なくとも2つの並列性レベル。この場合、各タスクを実行するために新しいスレッドが作成されます)。監視、デバッグ、および追跡を簡素化するために、生成されたすべての非同期タスクはマーカーインタフェースAsynchronousCompletionTaskのインスタンスです。
ただし、同期(または少なくとも非同期)メソッドの動作は不明なままです。ほとんどの状況では、コードはそうように、元のスレッドで実行されます。コードの第2のブロックは、時には代わりに共通のプールを使用するように
Thread thread = Thread.currentThread();
CompletableFuture.runAsync(() -> {
// Should run on the common pool - working as expected
assert thread != Thread.currentThread();
}).thenRun(() -> {
// Returns to running on the thread that launched.. sometimes?
assert thread == Thread.currentThread();
}).join();
しかし、この試験の繰り返しは、一貫性のない結果をもたらします。この状況で意図された動作は何ですか?