ЗавершаемоеБудущее недопониманиеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ЗавершаемоеБудущее недопонимание

Сообщение Anonymous »

Кажется, я с треском провалился в очевидно простом примере с CompletableFuture.
У меня есть CompletableFuture, который заблокирован в другом потоке, что-то вроде:

Код: Выделить всё

        Supplier one = () -> CompletableFuture.supplyAsync(() -> {
System.out.println("started cf");
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(3));
System.out.println("done cf");
return "";
});
ExecutorService service = Executors.newSingleThreadExecutor();
service.submit(() -> {
try {
future = one.get();
future.get();
} catch (Exception e) {
System.out.println("caught");
future.completeExceptionally(e);
}
});
Я хочу иметь возможность отменить его, а затем присоединиться и дождаться его завершения в потоке, отличном от приведенного выше, так что что-то вот так:

Код: Выделить всё

    static CompletableFuture future;

public static void main(String[] args) {

Supplier one = () -> CompletableFuture.supplyAsync(() -> {
System.out.println("started cf");
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(3));
System.out.println("done cf");
return "";
});
ExecutorService service = Executors.newSingleThreadExecutor();
service.submit(() -> {
try {
future = one.get();
future.get();
} catch (Exception e) {
System.out.println("caught");
future.completeExceptionally(e);
}
});

LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
future.cancel(true);
System.out.println("before join");
String s = future.join();
System.out.println("s value : " + s);
System.out.println("done");
}
К моему удивлению, этот String s = Future.join(); блокируется, и я не понимаю почему.
Еще более удивительно, если я изменю свой код на (вместо String s = Future.join();):

Код: Выделить всё

        String s = null;
try {
s = future.join();
} catch(Exception e) {
System.out.println("here : " + e.getClass());
}
этот не блокирует. Может кто-нибудь пролить здесь свет?

Подробнее здесь: https://stackoverflow.com/questions/785 ... erstanding
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»