2016-02-29 76 views
3

我正在使用Akka並行執行一堆非常短的任務。我使用system.actorOf創建了一個父演員,該演員使用context().actorOf創建了25個其他演員。然後我在父Actor中調用context().stop(getSelf()),這應該停止所有的孩子。爲什麼Akka會將所有這些線程停放?

我正在觀察VisualVM中的線程狀態,以瞭解一些關於Akka如何在後臺工作的內容,並且我注意到當我在父Actor上調用stop()時,Akka產生的線程開始慢慢被逐個殺死在不同的時間,其餘的仍然停放。這是前10分鐘,所有的線程被打死,但這裏很快的快照我叫stop(),在那裏你可以在默認調度員看到幾個線程被殺害之後,但在多數其餘停放:

enter image description here

爲什麼這些線程不會全部同時被殺死?他們爲什麼會一次又一次地看起來任意被殺呢?爲什麼讓他們任何一個停放?我似乎並沒有創建其他演員重用這些線程。

回答

3

默認分派器使用Java的ForkJoinPool。這將根據需要添加線程來運行作業,然後在閒置一段時間後逐漸關閉它們。 API沒有保證空閒線程能夠存活多長時間,所以這取決於實現。如果你想更明確地處理線程的數量,你可以使用不同類型的池,比如固定線程。

ForkJoinPool

相關問題