当前位置: 首页 > 面试题库 >

如何实现ExecutorService以基于轮换的方式执行任务?

盖绪
2023-03-14
问题内容

我使用带有固定线程池的java.util.concurrent.ExecutorService执行任务列表。我的任务列表通常约为80-150,并且我将随时运行的线程数限制为10,如下所示:

ExecutorService threadPoolService = Executors.newFixedThreadPool(10);

for ( Runnable task : myTasks ) 
{     
    threadPoolService.submit(task); 
}

我的用例要求即使完成的任务也应重新提交给 ExecutorService, 但只有在服务/完成所有
提交的任务后才应再次执行/采用。基本上,提交的任务应以轮换为基础执行。因此,在这种情况下不会有threadPoolService.shutdown()threadPoolService.shutdownNow()呼叫。

我的问题是,如何实现 ExecutorService 服务旋转基础任务?


问题答案:

ThreadPoolExecutor为afterExecution提供了一个扩展点,您可以在其中将作业放回队列的末尾。

public class TaskRepeatingThreadPoolExecutor extends ThreadPoolExecutor {

    public TaskRepeatingThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        this.submit(r);
    }
}

当然,您将需要做更多的工作来自己实例化它,而无需ExecutorService使用方便的工厂方法,但是构造函数非常简单,可以轻松完成。



 类似资料:
  • 我使用java.util.concurrent.ExecutorService和固定线程池来执行任务列表。我的任务列表通常在80-150个左右,我已经将任何时候运行的线程数限制为10个,如下所示: 我的用例要求即使完成的任务也应该重新提交给ExecutorService,但是只有当所有已经提交的任务都被服务/完成时,才应该再次执行/获取。也就是说,提交的任务基本上应该轮流执行。因此,在这种情况下不

  • 问题内容: 我有三个连接的线程,即第二个线程在第一个死后执行。 这是我的代码: 我将如何使用而不是三个线程对象来实现此功能? 问题答案: 如果您想要/需要的是一个接一个地执行一组作业,但要在与主应用程序线程不同的单个线程中执行,请使用。

  • 问题内容: 我们有一个问题。:) 我们要确保任何时候只有N个线程在执行后台任务。为此,我们使用了固定线程池执行程序。它似乎工作正常。 然后我们发现了一个问题。假设您有一个使用执行程序执行一些并行工作的类,然后在执行程序线程中调用了另一个类,该线程也执行一些并行工作,打算等待它。这是发生了什么: 主线程调用第一级方法。 这种方法认为它可以并行化为16个任务,并拆分其工作。 16个任务被提交给执行者。

  • 本文向大家介绍PHP实现定时执行任务的方法,包括了PHP实现定时执行任务的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现定时执行任务的方法,代码简单实用。分享给大家供大家参考。 具体实现方法如下: 希望本文所述对大家的PHP程序设计有所帮助。

  • 本文向大家介绍基于jquery实现轮播特效,包括了基于jquery实现轮播特效的使用技巧和注意事项,需要的朋友参考一下        轮播是学习jquery开始的第二个实现的动效,也是学习时间最久的一个。在实现轮播的过程中总是会遇到各种各样的问题,请教过很多人,也多次问过度娘。今天,也不敢果敢的说,可以马上写好一个轮播。         希望是通过随笔的方式,记录下一些思维过程。   首先是htm

  • 问题内容: 快速回顾一下-我有一个Java EE前端,可以接受用户请求,然后针对每个请求使用ExecutorService(SingleThreadedExecutor设置为守护程序)启动冗长的工作流,该工作流包含在库中并且可以工作很好,并且在通过Eclipse以独立模式运行时按预期运行。当从website(servlet)调用时,我观察到工作流始终在初始化Velocity Engine(Velo