spring取消@异步任务
我希望能够在@Async
将来取消带有注释的方法。
我有一个标有@Async
注释的Spring方法。此方法进行一些计算,并最终返回结果。我见过的所有示例都建议使用AsyncResult
该类返回此Future。
@Asyncpublic Future<String> run() {
// ... Computation. Minutes pass ...
return new AsyncResult<String>("Result");
}
我以下列方式从另一个组件调用以下方法。出于示例目的,我希望立即取消该线程:
Future<String> future = component.run();future.cancel(true);
- 在这种情况下,线程将永远不会被取消。这是因为,在
AsyncResult
这里查看Spring实现:[https](https://github.com/spring- - projects/spring-framework/blob/master/spring-
- context/src/main/java/org/springframework/scheduling/annotation/AsyncResult.java#L71)
- //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()
or
future.cancel(true)就不会立即停止正在进行的线程。这些方法所做的只是.interrupt()
在相应线程上调用。而且interrupts
还
生效。它发出一个标志,因此无论何时处于睡眠或等待状态,线程都将停止。
需要注意的是,如果您的任务忽略中断,executor.shutdownNow() and
future.cancel(true)则其行为与完全相同executor.shutdown() and future.cancel(false)
。
如果需要停止慢速或阻塞操作的方法。如果您有一个长/无尽循环,则可以添加条件Thread.currentThread().isInterrupted()
,如果为true,则不继续(结束操作)。
以上是 spring取消@异步任务 的全部内容, 来源链接: utcz.com/qa/425010.html