2015-06-04 62 views
0

I用于在超时后中断任务的ExecutorService。我为此使用ScheduledExecutorService。首先,我提交了该线程,并立即开始并保留创建的未来。之后,我使用ScheduledExecutorService作为一项新任务,在一段时间后取消保留的未来。ScheduledExecutorService和ThreadPoolTask​​Executor在超时后中断任务

//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任务我线程池是不能接受的。我只需要取消长时间运行并超时的任务。

任何想法如何实现这一目标?

+0

什么是'batchJob'?取消它必须负责取消“所有'在这里输入代码'任务[in] ThreadPool”。所以,显示'batchJob'的代码。 'batchJob'是否参考了很多其他任务?这将是一个问题。 – erickson

+0

请参阅[输入链接说明](http://stackoverflow.com/questions/42946627/scheduledexecutorservice-that-interrupts-after-a-timeout) –

回答

0

目前尚不清楚您的CompletionService是什么,并且您正在提交您的batchJob,因此很难确定问题的确切根本原因。但提交少量任务并在一段时间后取消它们的理想方案是使用ScheduledExecutorService来实现这两个目的。

因此,可以尝试提交ScheduledExecutorServiceexecutor的实例batchJob

final Future<String> future = executor.submit(batchJob); // Submit actual task and get future  

编辑更新:你应该在你的代码
做重要改变我看到你永远不会停止你的ScheduledExecutorService这是错误的,因为它的资源占用将永远不会被释放,直到你停止它。所以,你的更新代码应该如下:

ScheduledExecutorService executor = Executors.newScheduledThreadPool(Integer.parseInt(config.getProperty("DBPOLLER_COREPOOLSIZE"))); 
final Future<String> future = executor.submit(batchJob); // Submit actual task and get future 
executor.schedule(new Runnable() { 
     public void run() { 
     future.cancel(true); 
     executor.shutdownNow(); 
     } 
    }, dbPollerTimeOut, TimeUnit.MINUTES); 
相关问题