请考虑我有以下内容:
public class MyRunnable implements Runnable {
public void run() {
//do something expensive
}
}
public class ThreadExecutor {
private TaskExecutor taskExecutor;
public ThreadExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
public void fireThread(){
taskExecutor.execute(new MyRunnable());
}
}
我的xml如下:
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="25" />
</bean>
<bean id="threadExecutor" class="com.vanilla.threads.controllers.ThreadExecutor">
<constructor-arg ref="taskExecutor" />
</bean>
在我的Spring MVC控制器中,我开始执行任务:
@RequestMapping(value="/startTask.html", method=RequestMethod.GET)
public ModelAndView indexView(){
ModelAndView mv = new ModelAndView("index");
threadExecutor.fireThread();
return mv;
}
现在让我们考虑一下我想创建另一个请求(@RequestMapping(value="/checkStatus.html"
),它将告诉我先前请求中启动的任务是否已经完成。
所以我的问题很简单:
1)我可以在TaskExecutor中为任务指定名称吗?如果是,我该怎么办?
2)如何检查具有该特定名称的任务是否已完成?
答案 0 :(得分:3)
1)不,但是..
而不是使用taskExecutor.execute()
使用taskExecutor.submit()
返回Future
。将Future
放入HttpSession
,当checkStatus请求进入时,从会话中提取Future
并在其上调用isDone()
。如果您需要为其命名,那么不要将Future
直接放在会话中,而是在会话中有一个Map<String, Future>
,其中键是您的任务名称。