Он также обрабатывает безопасную инициализацию опубликованных объектов, как показано в том же обзоре позже:
я есть служебный метод (используется для модульного тестирования, так бывает), который выполняет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
закончил выполнение, и его результаты были благополучно опубликованы?