レドワルド:
私は(それがそう起こるユニットテストのために使用される)実行するユーティリティメソッドを持っているRunnable
別のスレッドで。これは、スレッドの実行を開始しますが、待ちませんThread
終了する、代わりに頼りますFuture
。メソッドの呼び出し元はに期待されてget()
いますFuture
。しかしによって行わ計算の安全な公表を確保するために十分なですかRunnable
?
ここで方法は次のとおりです。
private static Future<Void> runInOtherThread(final CountDownLatch ready, final Runnable operation) {
final CompletableFuture<Void> future = new CompletableFuture<Void>();
final Thread thread = new Thread(() -> {
try {
ready.await();
operation.run();
} catch (Throwable e) {
future.completeExceptionally(e);
return;
}
future.complete(null);
});
thread.start();
return future;
}
呼び出した後にFuture.get()
返された上でFuture
、メソッドの呼び出し元は安全と仮定することができRunnable
、完成実行を持っており、その結果を安全に公開されていますか?
スティーブンC:
あなたがする必要はありませんありませんjoin()
。呼び出しget()
将来には十分です。
CompletableFuture
インターフェイスは、のサブタイプですFuture
。そして、javadocのためには、Future
このことを述べています:
メモリー整合性効果:非同期計算で撮影したアクションが起こる前に、対応する次のアクション
Future.get()
別のスレッドにします。
それが起こる前に、関係がで返される値の安全な公表を確保するのに十分ですget()
。
さらに、get()
まで呼び出しが完了しませんCompletableFuture
非常に完了またはキャンセル、完了しています。