1

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

4

2 回答 2

1

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

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

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

我能想到的最简单的方法是创建自己的 ExecutorService 来扩展 ThreadPoolExecutor。然后覆盖 execute() 方法,以便在委托给超类执行之前调用 BlockingQueue#contains(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(也称为组合)。

于 2010-04-08T03:21:43.907 回答
0

线程池不保证任务排序。

至于第二部分,您可以使用ThreadPoolExecutor.DiscardPolicyusing设置拒绝的执行处理程序ThreadPoolExecutor

于 2010-04-08T01:05:35.913 回答