Pat*_*k D 6 java spring multithreading asynchronous spring-mvc
我希望能够@Async
通过它的未来取消标注注释的方法.
我有一个标有@Async
注释的Spring方法.此方法执行一些计算,并最终返回结果.我见过的所有示例都建议使用AsyncResult
该类来返回此Future.
@Async
public Future<String> run() {
// ... Computation. Minutes pass ...
return new AsyncResult<String>("Result");
}
Run Code Online (Sandbox Code Playgroud)
我以下面的方式从另一个Component调用以下方法.例如,我希望立即取消这个帖子:
Future<String> future = component.run();
future.cancel(true);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,线程永远不会被取消.这是因为,看着春天实施AsyncResult
这里:https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/java/org/springframework/scheduling/annotation/ AsyncResult.java#L71,这个方法实际上并没有做任何事情.它只返回false,表示线程无法取消.这是我的问题.如何取消@Async
方法创建的线程?我无法访问Spring创建的内部线程 - 所以我没有办法取消它,我呢?
小智 7
实际上,Spring @Async
使用它自己的后台线程池.并且只要涉及Future的cancel()方法或执行程序服务的shutdownNow(),Calling executor.shutdownNow() or future.cancel(true)
就不会立即停止正在进行的线程.这些方法的作用只是调用.interrupt()
相应的线程.而且interrupts
还没有保证即时生效.它会发出一个标志,因此无论何时处于休眠或等待状态,线程都将被停止.
需要注意的是,如果您的任务忽略了中断,其executor.shutdownNow() and future.cancel(true)
行为方式将完全相同executor.shutdown() and future.cancel(false)
.
如果您需要一种方法来停止缓慢或阻塞操作.如果你有一个很长/无限循环,你可以添加一个条件Thread.currentThread().isInterrupted()
,如果是真的话是否继续(结束操作).
归档时间: |
|
查看次数: |
6540 次 |
最近记录: |