微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Spring取消@Async任务

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

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

@Async
public Futurecomputation. Minutes pass ...
    return new AsyncResult

我以下面的方式从另一个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(),如果是真的话就不要继续(结束操作).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐