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

Gna*_*nam 6 java multithreading threadpool

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

ExecutorService threadPoolService = Executors.newFixedThreadPool(10);

for ( Runnable task : myTasks ) 
{     
    threadPoolService.submit(task); 
}
Run Code Online (Sandbox Code Playgroud)

我的用例要求甚至已完成的任务应该再次重新提交给ExecutorService,但只有在所有提交的任务都得到服务/完成时才应该执行/再次执行.基本上,提交的任务应该以轮换方式执行.因此,在这种情况下不会有任何一种情况threadPoolService.shutdown()threadPoolService.shutdownNow()呼叫.

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

Aff*_*ffe 10

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

你必须做一些更多的工作当然是在没有ExecutorService方便的工厂方法的帮助下自己实例化它,但构造函数很简单,可以理解.