我有一个 Executors.newFixedThreadPool(1),我将几个不同的任务发送到(都实现了 Runnable),它们排队并按顺序运行正确吗?一次只允许每个任务中的一个运行或排队的最佳方法是什么?我想忽略所有发送到队列中的 ExecutorService 任务。
问问题
1029 次
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.DiscardPolicy
using设置拒绝的执行处理程序ThreadPoolExecutor
于 2010-04-08T01:05:35.913 回答