java – Spring取消@Async任务

前端之家收集整理的这篇文章主要介绍了java – Spring取消@Async任务前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我希望能够通过它的未来取消用@Async注释标记方法.

我有一个标有@Async注释的Spring方法.此方法执行一些计算,并最终返回结果.我见过的所有示例都建议使用AsyncResult类来返回此Future.

@Async
public Future

我以下面的方式从另一个Component调用以下方法.例如,我希望立即取消这个帖子:

Future

在这种情况下,线程永远不会被取消.这是因为,在这里查看AsyncResult的Spring实现:https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/java/org/springframework/scheduling/annotation/AsyncResult.java#L71,这个方法实际上并没有做任何事情.它只返回false,表示线程无法取消.这是我的问题.如何取消@Async方法创建的线程?我无法访问Spring创建的内部线程 – 所以我没有办法取消它,我呢?

最佳答案
实际上,Spring @Async使用它自己的后台线程池.并且只要涉及Future的cancel()方法或执行程序服务的shutdownNow(),调用executor.shutdownNow()或future.cancel(true)就不会立即停止正在进行的线程.这些方法的作用只是在相应的线程上调用.interrupt().中断并不能保证立竿见影.它发出一个标志,所以无论何时处于休眠或等待状态,线程都将被停止.

需要注意的是,如果您的任务忽略了中断,则executor.shutdownNow()和future.cancel(true)的行为方式与executor.shutdown()和future.cancel(false)完全相同.

如果您需要一种方法来停止缓慢或阻塞操作.如果你有一个很长/无限循环,你可以添加一个条件,无论是Thread.currentThread().isInterrupted(),如果是真的话就不要继续(结束操作).

猜你在找的Spring相关文章