当前位置: 首页 > 知识库问答 >
问题:

超时后中断任务的ScheduledExecutorService和ThreadPoolTaskExecutor

邰德业
2023-03-14

我使用ExecutorService在超时后中断任务,为此我使用ScheduledExecutorService。首先,我提交的线程和它一次开始立即,并保留未来的创建。之后,我使用ScheduledExecutorService作为一个新任务,它将在一段时间后取消保留的future。

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

            } 

我已经实现了以下URL:ExecutorService中的解决方案,该解决方案在超时后中断任务,在超时之前它工作得很好,但是一旦发生超时,它将取消所有Enter code here我线程池中的任务,这是不可接受的。我只需要取消长时间运行的任务,并达到超时。

你知道怎么做到这一点吗?

共有1个答案

尹乐邦
2023-03-14

不清楚您的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);
 类似资料:
  • 问题内容: 我正在寻找可以提供超时的ExecutorService实现。如果提交到ExecutorService的任务花费的时间超过了超时时间,则这些任务将被中断。实现这样的野兽并不是一个困难的任务,但是我想知道是否有人知道现有的实现。 这是我根据以下一些讨论得出的。任何意见? 问题答案: 你可以为此使用ScheduledExecutorService。首先,你只提交一次即可立即开始,并保留创建的

  • 我需要实现一个预定的执行器服务,它每隔x秒运行一个线程。线程执行应该中断,以防它需要超过y秒。我曾尝试使用SchduledExecutorService实现该解决方案,该解决方案具有可配置的间隔参数,但没有超时参数。我有一些想法,我想听听你对实现/技术的建议。

  • 问题内容: 我正在尝试以这种方式使用python的多处理程序包: 从池的进程中,我要避免等待等待60多个返回结果的进程。那可能吗? 问题答案: 这是一种无需更改功能即可执行此操作的方法。需要两个步骤: 使用您可以传递的选项来确保每次执行任务后重新启动池中的工作进程。 将现有的辅助函数包装在另一个函数中,该函数将调用守护程序线程,然后等待该线程的结果数秒钟。使用守护程序线程很重要,因为进程在退出之前

  • 问题内容: 我有一个时间周期性地与一些不同的任务; 我也有Runnable与此计划程序一起使用的不同之处。当我想从调度程序中删除任务之一时,问题就开始了。 有没有办法做到这一点? 我可以使用一个调度程序完成不同的任务吗?实现此目的的最佳方法是什么? 问题答案: 只需取消以下项返回的未来: 要注意的另一件事是,取消不会从计划程序中删除任务。它所确保的是isDone方法总是返回true。如果继续添加此

  • 问题内容: 在ScheduledExecutorService中运行时,是否有种不错的方法可以阻止任务内部重复任务? 可以说,我有以下任务: 从外部,很容易通过f.cancel()取消,但是如何在指定的位置停止重复?(通过AtomicReference传递Future是不安全的,因为当scheduleAtFixedRate返回f较晚并且变量也设置得较晚时,存在一个潜在的窗口,并且任务本身可能已经运