Java 未来超时和IO超时
我有多个线程调用一个API。API打开一个未设置超时的套接字。但是,我在future.get()上设置了超时。如果套接字永远保持打开状态,future的超时是否会起作用并退出调用API的任务处理?future.get将在超时过期时抛出一个Java 未来超时和IO超时,java,multithreading,Java,Multithreading,我有多个线程调用一个API。API打开一个未设置超时的套接字。但是,我在future.get()上设置了超时。如果套接字永远保持打开状态,future的超时是否会起作用并退出调用API的任务处理?future.get将在超时过期时抛出一个TimeoutException 然而,底层任务将继续执行,除非您有办法中断它。例如,可以通过关闭套接字(如果您有权访问它)或通过API提供的任何机制来实现 您可以尝试中断执行,但由代码捕获中断(通过Thread.interrupted()),因此根据底层任务实
TimeoutException
然而,底层任务将继续执行,除非您有办法中断它。例如,可以通过关闭套接字(如果您有权访问它)或通过API提供的任何机制来实现
您可以尝试中断执行,但由代码捕获中断(通过Thread.interrupted()
),因此根据底层任务实现,中断可能没有效果:
try {
Future<R> future = // ...
} catch (TimeoutException e) {
// ...
future.cancel(true); // try to interrupt
}
试试看{
未来=/。。。
}捕获(超时异常e){
// ...
future.cancel(true);//尝试中断
}
当Future抛出TimeoutException时,线程是否停止?或者它只是等待底层任务完成?此外,future方面或任何其他方面(除了您已经提到的以外)是否有任何机制可以中断底层IO操作?没有,因为任务有责任知道在中断时该做什么。或在必要时提供中断机制。否则,它可能会产生不良的副作用。所以,若底层任务并没有中断,线程将永远挂起?若你们并没有办法中断它,是的。您可以使用while(true)
loop等简单示例进行测试感谢您的响应Jean!:-)