I用于在超时后中断任务的ExecutorService。我为此使用ScheduledExecutorService。首先,我提交了该线程,并立即开始并保留创建的未来。之后,我使用ScheduledExecutorService作为一项新任务,在一段时间后取消保留的未来。ScheduledExecutorService和ThreadPoolTaskExecutor在超时后中断任务
//Start Spring executor to submit tasks
ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) ApplicationContextProvider.getApplicationContext().getBean("taskExecutor");
CompletionService completionService = new ExecutorCompletionService(taskExecutor);
//End Spring executor to submit tasks
// Start ScheduledExecutorService to submit returned future object to timeout
ScheduledExecutorService executor = Executors.newScheduledThreadPool(Integer.parseInt(config.getProperty("DBPOLLER_COREPOOLSIZE")));
final Future<String> future = completionService.submit(batchJob); // Submit actual task and get future
// submit future
executor.schedule(new Runnable() {
public void run() {
future.cancel(true);
}
}, dbPollerTimeOut, TimeUnit.MINUTES);
int count = taskExecutor.getActiveCount();
if (count == 0) {
taskExecutor.shutdown();
executor.shutdown();
finalExitStatus = 0;
break;
}
我已经实现了解决方案,它是在以下网址: ExecutorService that interrupts tasks after a timeout,它做工精细,直到超时,但一旦发生超时,这将取消所有enter code here
任务我线程池是不能接受的。我只需要取消长时间运行并超时的任务。
任何想法如何实现这一目标?
什么是'batchJob'?取消它必须负责取消“所有'在这里输入代码'任务[in] ThreadPool”。所以,显示'batchJob'的代码。 'batchJob'是否参考了很多其他任务?这将是一个问题。 – erickson
请参阅[输入链接说明](http://stackoverflow.com/questions/42946627/scheduledexecutorservice-that-interrupts-after-a-timeout) –