2017-02-19 139 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建議。