2017-02-19 79 views
-1

CompletableFuture未完成时会发生什么?它会花费内存泄漏吗?或者更糟的是它是否用完了线程池中的线程?CompletableFuture未完成时会发生什么?

如果确实发生了什么,我们可以做些什么来清理这些未完成的未来?

澄清让我说我有一个像下面这样的函数,这会导致任何泄漏或在执行任务时消耗池中的线程吗?

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

为什么它没有完成? – shmosel

+0

我不明白你的困惑。 'CompletableFuture'与任何线程无关。它的行为与其他任何对象一样。当它被认为无法访问时,它会被GC'ed。 –

+0

'supplyAsync'的javadoc说什么? –

回答

0

那么你怎么看?如果你有一个线程运行一个无限循环,那么你有一个线程没有被用于其他任何事情。除非你明确cancel()的处理,否则没有什么会自动停止。

所以问题是:你为什么要作为CompletableFuture运行一个无限长的任务?

0

绝对长的任务是产生一个运行时来执行一个命令并捕获结果输出。事实证明,卡住的行为归咎于产生的进程试图等待孤立的锁(拥有它的进程死掉)。

清理锁后,代码开始工作。我想回想起来,答案应该是显而易见的,因为@Kayaman建议。

相关问题