Java 限制ExecutorService队列中每个可运行类型中的一个

Java 限制ExecutorService队列中每个可运行类型中的一个,java,multithreading,executorservice,Java,Multithreading,Executorservice,我有一个Executors.newFixedThreadPool(1),我将几个不同的任务发送给它(所有任务都是可运行的),它们排队并按顺序运行,对吗?一次只允许一个任务运行或排队的最佳方式是什么?我想忽略发送到ExecutorService的所有已在队列中的任务。线程池不保证任务排序 至于第二部分,您可以使用线程池来设置被拒绝的执行处理程序,线程池不保证任务排序 对于第二部分,您可以使用 我有一个Executors.newFixedThreadPool(1),我将几个不同的任务发送给它(所有任

我有一个Executors.newFixedThreadPool(1),我将几个不同的任务发送给它(所有任务都是可运行的),它们排队并按顺序运行,对吗?一次只允许一个任务运行或排队的最佳方式是什么?我想忽略发送到ExecutorService的所有已在队列中的任务。

线程池不保证任务排序


至于第二部分,您可以使用线程池来设置被拒绝的执行处理程序,线程池不保证任务排序

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

我有一个Executors.newFixedThreadPool(1),我将几个不同的任务发送给它(所有任务都是可运行的),它们排队并按顺序运行,对吗

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

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

我认为最简单的方法是创建您自己的ExecutorService,它扩展了ThreadPoolExecutor。然后重写execute()方法,以便在委托给超级类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
        }
    }
}
公共类LimitedExecutorService扩展ThreadPoolExecutor{
公共有限公司执行服务(最终整数){
super(nThreads,nThreads,0L,TimeUnit.ms,new LinkedBlockingQueue());
}
@凌驾
public void execute(Runnable命令){
如果(!this.getQueue()包含(命令)){
super.execute(命令);
}否则{
//拒绝
}
}
}
注意:许多人会认为您不应该扩展ThreadPoolExecutor,而应该说您实现了ExecutorService,并让您的类包含一个您委托给的ThreadPoolExecutor(也称为composition)

我有一个Executors.newFixedThreadPool(1),我将几个不同的任务发送给它(所有任务都是可运行的),它们排队并按顺序运行,对吗

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

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

我认为最简单的方法是创建您自己的ExecutorService,它扩展了ThreadPoolExecutor。然后重写execute()方法,以便在委托给超级类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
        }
    }
}
公共类LimitedExecutorService扩展ThreadPoolExecutor{
公共有限公司执行服务(最终整数){
super(nThreads,nThreads,0L,TimeUnit.ms,new LinkedBlockingQueue());
}
@凌驾
public void execute(Runnable命令){
如果(!this.getQueue()包含(命令)){
super.execute(命令);
}否则{
//拒绝
}
}
}
注意:许多人会认为您不应该扩展ThreadPoolExecutor,而应该说您实现了ExecutorService,并让您的类包含一个您委托给的ThreadPoolExecutor(也称为composition)