2017-02-19 8 views
-1

Что произойдет, когда CompletableFuture не завершится? Стоит ли утечка памяти? или, что еще хуже, он использует поток из пула потоков?Что происходит, когда CompletedFuture никогда не заканчивается?

Если это произойдет, что мы можем сделать, чтобы очистить эти незавершенные фьючерсы?

Чтобы уточнить, допустим, что у меня есть функция, подобная следующей, может ли это вызвать утечку или уничтожить поток в пуле во время выполнения задачи?

public void foo() 
{ 
    CompletableFuture.supplyAsync(this::functionNeverComplete, pool) 
     .whenComplete((r,e) -> logger.info("done {}",r,e)); 
} 
+1

Почему он не заполняется? – shmosel

+0

Я не понимаю ваше замешательство. «CompletableFuture» не связан ни с какими потоками. Он ведет себя как любой другой объект. Он получит GC'ed, если его считают недостижимым. –

+0

Что говорит javadoc 'supplyAsync'? –

ответ

0

Ну что вы думаете? Если у вас есть поток с бесконечным циклом, у вас есть один поток, который не используется ни для чего другого. Если вы явно не указали cancel() обработку, ничто не остановит ее автоматически.

Итак, вопрос в следующем: зачем вы запускаете бесконечно длинную задачу как CompletableFuture?

0

Совершенно длинной задачей было создание времени выполнения для выполнения команды и захвата полученного результата. Оказывается, застрявшее поведение приписывается порожденному процессу, пытаясь дождаться блокировки, которая была сиротой (процесс, который ее владел).

После того, как замок был очищен, код начинает работать. На мой взгляд, ретроспективный ответ должен быть очевиден, как предположил Байян.

Смежные вопросы