2017-03-07 65 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