JAVA中如何在超时后停止异步方法线程
我有一些render()名称的方法,我想异步调用它,并将timeout设置为该异步调用 当超时结束时,我需要停止异步调用。 我尝试过这样的代码,但它在超时后并没有停止异步调用JAVA中如何在超时后停止异步方法线程,java,Java,我有一些render()名称的方法,我想异步调用它,并将timeout设置为该异步调用 当超时结束时,我需要停止异步调用。 我尝试过这样的代码,但它在超时后并没有停止异步调用 Future<File> fileFuture = null; try { fileFuture = executor.getThreadPoolExecutor() .submit(() -> render()); retu
Future<File> fileFuture = null;
try {
fileFuture = executor.getThreadPoolExecutor()
.submit(() -> render());
return fileFuture.get(10,TimeUnit.SECONDS);
} catch (TimeoutException e) {
fileFuture.cancel(true);
throw new MyTimeOutException(e);
}
}
Future fileFuture=null;
试一试{
fileFuture=executor.getThreadPoolExecutor()
.submit(()->render());
返回fileFuture.get(10,TimeUnit.SECONDS);
}捕获(超时异常e){
fileFuture.cancel(true);
抛出新的MyTimeOutException(e);
}
}
我如何在Java中做到这一点
而且最好是由Java并发包来完成
我想补充一点,我使用Spring引导,请编写Spring是否有任何解决方案。当您调用
fileFuture.cancel(true)
时,Java将向运行render()
的线程发送中断。但是,这本身不会自动停止渲染任务。您需要从render()
中检查中断,并在检测到中断时停止
如果不查看render()
的实现,就很难说您应该在方法中检查它的确切位置,但通常您应该在长时间运行的任务期间定期检查中断。下面是一个例子:
public void render(){
对于(inti=0;i
您可以阅读完整的Oracle中断指南
请注意,即使使用此解决方案,调用
cancel()
时,您的render()
方法也不会立即停止-调用cancel()
和render()
检查中断之间会有一个延迟。检查中断的频率越高,延迟就越小。谢谢您的回答,我只需要在超时后取消该线程之外的异步线程。没有解决方法吗?您可以查看Thread.stop
和Thread.suspend
,但这里有一篇来自Oracle的文章,介绍了为什么这是一个非常糟糕的主意-