2016-11-18 94 views
0

我正在使用java服務器應用程序中的jWebsocket lib執行一些壓力測試(每分鐘有數千個連接),並且在一段時間後,該進程完全充滿了jWebsocket線程,例如以下:jWebsocket大量停放的線程(等待)

"jWebSocket TCP-Engine NIO writer" prio=10 tid=0x0000000000bf6000 nid=0x2eb9 waiting on condition [0x00007f1533bd9000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x000000062ab06e80> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

(上面的輸出是從一個線程轉儲檢索)

有沒有人遇到這個問題?任何提示找到解決方案?

謝謝!

編輯。

最大的問題是線程永遠不會被終止並保持活動狀態,直到應用程序終止。

回答

1

這是正常情況,您的線程池由於高負載而顯着增長,然後負載下降。在這種情況下,池中的大部分線程都在等待新的任務有效地執行任何操作。

你可以通過改變核心池大小和最大池大小殺閒散人員:

executor.setCorePoolSize(x); 
executor.setMaximumPoolSize(y); 
+0

我忘了提一個非常重要的注意事項:)線程不被破壞,直到應用程序保持活力重新啓動。 –

+0

我爲你提供了「殺死」解決方案以防萬一。你看到的是完全正常的,線程正在等待新任務,給他們工作要做,他們將開始運行你的任務 – hoaz