2

我的情况如下:

我正在实现一个服务器,该服务器必须在每个请求的指定超时期限内超时或产生响应。因此,从服务器的角度来看,确保每个请求都是响应(当然,由于传输层故障等,响应可能无法到达客户端)。

为了实现上述语义,每个请求都会产生一个线程(实际上是从线程池中检索一个可用的线程)并通过同步对象上的通知等待其响应。等待时间受到发送到 Object 的等待方法的超时参数的限制。生成的线程将请求委托给实际知道如何处理请求的对象。此对象的调用 API 是已知的,但没有已知的服务级别协议指定调用永远不会无限期挂起。(特别是在我的情况下,服务器实际上是一个 CORBA 客户端——但这不是重点。)

现在,我感兴趣的是,是否有办法让我以某种方式检测到该线程没有响应然后杀死它(中断它),即使我目前在方法调用上被阻塞?

顺便说一句,我知道我可以保留对线程对象的引用,并在预先指定的时间后调用它的 interrupt() 方法。不幸的是,这并不能确保“中断”语义......

Java 线程原语弃用

谢谢大家

4

2 回答 2

3

我认为如果你不能依赖 interrupt() 语义,那么你可能会不走运。没有可靠或安全的方法来强制终止线程。用任何语言都是危险的。

我希望即使可以绕过它,interrupt() 也会为您提供所需的东西。CORBA 调用应该通过标准网络类,因此应该正确中断任何阻塞调用。

这是您在不产生完整子进程的情况下能做的最好的事情。

于 2009-12-22T19:03:25.850 回答
2

尝试使用ExecutorService并使实际的业务逻辑在 Callable 中执行。ExecutorService 返回的 Future 有一个get(),它允许您指定您将等待多长时间...

于 2009-12-22T18:48:02.033 回答