2016-02-29 33 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

相关问题