0

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

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

当请求卡在 synchronized{} 块中时,最大的问题就开始了,因此它们一直持有资源,并且无法满足其他请求。

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

Thread.stop() 已被弃用,而且显然也不适用于 netty,因为 netty 捕获 ThreadDeath 异常并将其转换为无害的警告消息......

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

什么是实现服务器以使其在这方面稳健的好方法?

4

1 回答 1

1

我相信不用说,您真正需要做的是找出并解决同步资源的问题,因为最终杀死线程不会真正完成工作。如果对资源一无所知,就不可能就该特定点向您提供建议。

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

冒着激怒某些纯粹主义者的风险,并建议谨慎行事,您可以使用sun.misc.Unsafe.tryMonitorEnter让其他线程避免进入同步块,如果同步点已被阻止,它将返回 false。

于 2013-04-30T10:26:13.883 回答