加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java – Spring取消@Async任务

发布时间:2020-12-15 01:50:34 所属栏目:大数据 来源:网络整理
导读:我希望能够通过它的未来取消用@Async注释标记的方法. 我有一个标有@Async注释的Spring方法.此方法执行一些计算,并最终返回结果.我见过的所有示例都建议使用AsyncResult类来返回此Future. @Asyncpublic Future 我以下面的方式从另一个Component调用以下方法.

我希望能够通过它的未来取消用@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(),如果是真的话就不要继续(结束操作).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读