我有一个Executors.newFixedThreadPool(1),我发送了几个不同的任务(所有实现Runnable),它们排队并按顺序运行正确吗?只允许每个任务中的一个一次运行或排队等待的最佳方法是什么?我想忽略发送到已经在队列中的ExecutorService的所有任务。
答案 0 :(得分:1)
我有一个Executors.newFixedThreadPool(1),我发送了几个不同的任务(所有实现Runnable),它们排队并按顺序运行正确吗?
是的,默认情况下,底层线程池执行程序是使用LinkedBlockingQueue创建的。由于您只有一个工作线程并且队列以FIFO方式使用,因此任务将按顺序执行。
只允许每个任务中的一个一次运行或排队等待的最佳方法是什么?我想忽略发送到已经在队列中的ExecutorService的所有任务。
我能想到的最简单的方法是创建自己的ExecutorService,它扩展了ThreadPoolExecutor。然后重写execute()方法,以便在委托超类执行之前调用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)