如何在Web服务器中停止线程

时间:2013-04-30 04:25:33

标签: java multithreading synchronization webserver netty

我有一个Java socket.io服务器,基于netty实现(com.corundumstudio.socketio)。

服务器使用某些闭源代码处理请求,有时,请求可能无限期地被卡住。

当请求卡在synchronized {}块中时,大问题就开始了,这样他们就可以持有资源,而且不能满足其他任何请求。

我想添加一个停止/杀死特定线程的选项,这样它就不会停止整个应用程序。

不推荐使用Thread.stop(),并且显然也不能使用netty,因为netty会捕获ThreadDeath异常并将其转换为无害的警告消息...

添加中断标志是不可能的,因为困难的代码已关闭。

实施服务器的好方法是什么,以便在这方面很强大?

1 个答案:

答案 0 :(得分:1)

我确信不用说,你真正需要做的是找出并解决同步资源的问题,因为终止线程实际上不会完成任务。如果不了解资源,就不可能就这个特定点提出建议。

在此期间,我建议您使用ReentrantLock包装有问题的代码段,每个线程必须获取该代码段才能到达同步块。实际上,您正在使用具有相同防护属性的锁替换同步行为(无法从中拉出线程),但是您可以为获取线程超时(因此线程不会通过使用tryLock(long timeout, TimeUnit unit)获得具有适当超时的锁来锁定并停止系统。 ReentrantLock还有一层“检测:允许您确定有多少线程正在等待锁定,并获取对线程本身的直接引用。最后一点对您有用,因为它允许您中断等待的线程作为* 停止 * ping它们的替代方案。一旦等待的线程被中断,它将抛出一个中断的异常,然后以完全合法且不弃用的方式继续运行。

冒着引起一些纯粹主义者的愤怒的风险,并且建议小心一点,你可以让其他线程使用sun.misc.Unsafe.tryMonitorEnter来避免进入同步块,如果同步点已经被阻止,它将返回false。 / p>