Gan*_*row 11 java multithreading spring-mvc
我有工作的春季MVC应用程序,我接下来要做的是从我的应用程序启动或提交后台任务.
基本上,即使用户决定在应用程序上执行其他操作,我也会继续执行任务,直到完成为止.
但是如果需要的话,我还想停止/杀死/暂停任务.因为在我寻找一个好的/更好的方法之前我没有这样做过.
我发现这些很有用:
http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/
Java线程:是否可以从同一JVM上运行的不同java程序查看/暂停/终止特定线程?
所以我想使用@Async任务来提交我的后台任务,但是想要稍后使用线程的id获取它并在需要时停止它?
这是正确的方法吗?我对多线程没有任何经验,所以我在这里听.
代码更新:
public interface Worker {
public void work();
public void cancel();
}
Run Code Online (Sandbox Code Playgroud)
实施:
@Component("asyncWorker")
public class AsyncWorker implements Worker {
@Async
public void work() {
String threadName = Thread.currentThread().getName();
System.out.println(" " + threadName + " beginning work");
try {
Thread.sleep(10000); // simulates work
} catch (InterruptedException e) {
System.out.println("I stopped");
}
System.out.println(" " + threadName + " completed work");
}
public void cancel() { Thread.currentThread().interrupt(); }
}
Run Code Online (Sandbox Code Playgroud)
控制器用于测试目的:
@ResponseBody
@RequestMapping("/job/start")
public String start() {
asyncWorker.work();
return "start";
}
@ResponseBody
@RequestMapping("/job/stop")
public String stop() {
asyncWorker.cancel();
return "stop";
}
Run Code Online (Sandbox Code Playgroud)
当我访问时/job/start
,我无法同时执行更多的任务.另一个只在第一个完成后才开始执行
另外当我访问/job/stop
过程没有停止时,我在这里缺少什么?
Tom*_*icz 10
使用线程ID太低而且脆弱.如果您决定使用@Async
注释(很好的选择),您可以使用它Future<T>
来控制任务执行.基本上你的方法应该返回一个Future<T>
而不是void
:
@Async
public Future<Work> work() //...
Run Code Online (Sandbox Code Playgroud)
现在你可以cancel()
说Future
,或者等待它完成:
@ResponseBody
@RequestMapping("/job/start")
public String start() {
Future<Work> future = asyncWorker.work();
//store future somewhere
return "start";
}
@ResponseBody
@RequestMapping("/job/stop")
public String stop() {
future.cancel();
return "stop";
}
Run Code Online (Sandbox Code Playgroud)
棘手的部分是以future
某种方式存储返回的对象,以便它可用于后续请求.当然你不能使用字段或ThreadLocal
.您可以放入会话,但请注意,这Future
不是可序列化的,并且不能跨群集工作.
由于@Async
通常由线程池支持,因此您的任务甚至可能无法启动.取消只会将其从池中删除.如果任务已在运行,您可以使用isInterrupted()
线程标记或句柄InterruptedException
来发现cancel()
调用.
归档时间: |
|
查看次数: |
8271 次 |
最近记录: |