【发布时间】:2015-08-19 09:46:27
【问题描述】:
我使用了 ExecutorService,它会在超时后中断任务。我为此使用了 ScheduledExecutorService。首先,我提交了线程,它一次立即开始并保留创建的未来。之后我使用 ScheduledExecutorService 作为一个新任务,它会在一段时间后取消保留的未来。
//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?取消它必须负责取消“所有enter code here任务[in] ThreadPool”。所以,显示batchJob的代码。batchJob是否以某种方式引用了许多其他任务?那会是个问题。
标签: java multithreading concurrency threadpool executorservice