Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA中如何在超时后停止异步方法线程_Java - Fatal编程技术网

JAVA中如何在超时后停止异步方法线程

JAVA中如何在超时后停止异步方法线程,java,Java,我有一些render()名称的方法,我想异步调用它,并将timeout设置为该异步调用 当超时结束时,我需要停止异步调用。 我尝试过这样的代码,但它在超时后并没有停止异步调用 Future<File> fileFuture = null; try { fileFuture = executor.getThreadPoolExecutor() .submit(() -> render()); retu

我有一些render()名称的方法,我想异步调用它,并将timeout设置为该异步调用

当超时结束时,我需要停止异步调用。 我尝试过这样的代码,但它在超时后并没有停止异步调用

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的文章,介绍了为什么这是一个非常糟糕的主意-