2017-03-07 118 views
0

我有通过套接字发送文件的非常简单的应用程序(2个参与者)。应用程序使用Spring Boot和Akka,传输完成后,没有其他事情发生。不过,即使在传输之后,我也注意到CPU占用率过高(例如4核心机器上的50%,即2个内核)。我捕获了活动线程的快照,其中约三分之一属于Akka。当没有任何事情发生时,Akka会做什么?

Akka在做什么,为什么需要这么多cpu?

http://pastebin.com/CF9yUvuL

+1

发布您的代码请 –

+0

请注意,虽然所有这些线程都是'WAITING'(https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html),所以他们正在占用你CPU的50%很可能是一个不正确的结论。 – johanandren

回答

1

一般回答你的问题:阿卡创建它是用来做异步消息处理线程池。所以如果你编写如下代码,你的应用程序永远不会终止,因为Akka一直在运行。

class Root extends Actor { 

    // create some child actors to do some work 

    override def receive: Receive = Actor.emptyBehavior 
} 

object Main { 

    def main(args: Array[String]): Unit = { 
    val system = ActorSystem("main") 
    system.actorOf(Props(new Root)) 
    } 
} 

所以平时如果需要终止您的应用程序将定义哪些信号,所有的工作已经完成,并发送此消息给你的根演员的消息。然后根主角可以调用context.system.terminate()来终止系统。

回到你的问题,我不明白你为什么要结合Akka和Spring Boot。你的线程转储,我不确定问题是否与阿卡有关。它看起来像线程挂在HttpClient内部。你确定你已经释放并关闭了所有打开的连接吗?

+0

我没有创建多个线程的问题,我只是不明白,为什么这些线程仍然活动(而不是等待消息)。应用程序是服务器,所以它故意没有终止。我没有看到一个理由,为什么Akka + Spring会是个坏主意,他们会做不同的事情。通过套接字只有一个连接,成功完成。 – spam

+1

讨论Akka + Spring Boot可能超出了这个问题的范围。对不起。没有一些代码示例就很难找出发生了什么。你可以在你的问题中添加[mcve](http://stackoverflow.com/help/mcve)吗? – britter

相关问题