限制ExecutorService队列中每个Runnable类型之一

时间:2010-04-08 01:01:56

标签: java multithreading executorservice

我有一个Executors.newFixedThreadPool(1),我发送了几个不同的任务(所有实现Runnable),它们排队并按顺序运行正确吗?只允许每个任务中的一个一次运行或排队等待的最佳方法是什么?我想忽略发送到已经在队列中的ExecutorService的所有任务。

2 个答案:

答案 0 :(得分:1)

  

我有一个Executors.newFixedThreadPool(1),我发送了几个不同的任务(所有实现Runnable),它们排队并按顺序运行正确吗?

是的,默认情况下,底层线程池执行程序是使用LinkedBlockingQueue创建的。由于您只有一个工作线程并且队列以FIFO方式使用,因此任务将按顺序执行。

  

只允许每个任务中的一个一次运行或排队等待的最佳方法是什么?我想忽略发送到已经在队列中的ExecutorService的所有任务。

我能想到的最简单的方法是创建自己的ExecutorService,它扩展了ThreadPoolExecutor。然后重写exe​​cute()方法,以便在委托超类执行之前调用BlockingQueue #contaite(Object)。

public class LimitedExecutorService extends ThreadPoolExecutor {
    public LimitedExecutorService(final int nThreads) {
        super(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
    }

    @Override
    public void execute(Runnable command) {
        if (!this.getQueue().contains(command)) {
            super.execute(command);
        } else {
            //reject
        }
    }
}

注意:很多人会争辩说你不应该扩展ThreadPoolExecutor,而是说你实现ExecutorService并让你的类包含你委托给的ThreadPoolExecutor(也就是组合)。

答案 1 :(得分:0)

线程池保证任务排序。

对于第二部分,您可以使用ThreadPoolExecutor.DiscardPolicy

使用ThreadPoolExecutor来设置被拒绝的执行处理程序