あなたは、その計算が完了していることを確認するために、スレッドに参加する必要があります

レドワルド:

私は(それがそう起こるユニットテストのために使用される)実行するユーティリティメソッドを持っている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非常に完了またはキャンセル、完了しています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=180767&siteId=1