【问题标题】:ScheduledExecutorService and ThreadPoolTaskExecutor that interrupts tasks after a timeoutScheduledExecutorService 和 ThreadPoolTask​​Executor 在超时后中断任务
【发布时间】: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


【解决方案1】:

不清楚您的CompletionService 是什么,并且您正在提交您的batchJob,因此很难说出问题的确切根本原因。但是提交少量任务并在一段时间后取消它们的理想方案是同时使用ScheduledExecutorService

所以,可以尝试提交batchJobon 实例ScheduledExecutorServiceexecutor

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);

【讨论】:

    猜你喜欢
    • 2017-04-27
    • 1970-01-01
    • 2021-01-02
    • 2011-02-15
    • 1970-01-01
    • 2015-08-09
    • 2017-03-02
    • 1970-01-01
    • 2019-04-30
    相关资源
    最近更新 更多