2016-11-18 40 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