Java 指定要添加到ExecutorService的可运行对象的限制

Java 指定要添加到ExecutorService的可运行对象的限制,java,executorservice,executor,Java,Executorservice,Executor,我知道我可以使用 ExecutorService executor = Executors.newFixedThreadPool(10); 我可以将可运行对象添加到执行器中,只要池中有线程空闲,它们就会执行 executor.execute(Obj); 我想限制要添加到executor服务的对象数量,即,如果我有100个可运行对象,线程池大小为10,只有20个必须添加到executor服务,其余的必须被拒绝 我想为执行器创建一个固定大小的等待列表,这样它就不必添加所有100个对象并将它们保持

我知道我可以使用

ExecutorService executor = Executors.newFixedThreadPool(10);
我可以将可运行对象添加到执行器中,只要池中有线程空闲,它们就会执行

executor.execute(Obj);
我想
限制要添加到executor服务的对象数量
,即,如果我有100个可运行对象,线程池大小为10,只有20个必须添加到executor服务,其余的必须被拒绝

我想为执行器创建一个固定大小的等待列表
,这样它就不必添加所有100个对象并将它们保持在等待状态,而只需保持固定数量的项目处于等待状态


我查看了Executor和ExecutorService API,但没有发现任何此类内容,只是想知道这是否可行?

尝试用以下内容包装您的
Executor
ExecutorService

public class ExecutorCountWrapper implements Executor {
    private final Executor executor;
    private final AtomicInteger count = new AtomicInteger();

    public ExecutorCountWrapper(Executor executor) {
        this.executor = executor;
    }

    @Override
    public void execute(final Runnable command) {
        count.incrementAndGet();
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    command.run();
                } finally {
                    count.decrementAndGet();
                }                
            }
        });        
    }

    public int getTaskCount() {
        return count.get();
    }
}

现在,您可以检查有多少任务等待执行,并提交更多任务或不提交更多任务。

所有Executor服务-单个、固定、缓存的线程池都由通用Executor
ThreadPoolExecutor
支持

您可以按如下方式重写execute方法:

class FiniteQueuedExecutorService extends ThreadPoolExecutor{
    int limitQueueSize=Integer.MAX_VALUE;

    //matching constructors here

    @Override
    public void execute(Runnable command) {
        if(getQueue().size()>limitQueueSize)
            throw new RuntimeException("Too Many enqueued runnables");
        super.execute(command);
    }
}

注意:您必须创建新的静态工厂,如
执行器
,以创建这些实例。

查看
线程池执行器
的构造函数。您可以向您的执行者提供有界队列和拒绝策略。拒绝策略告诉执行者当您尝试提交超出其处理能力的任务时该怎么做

例如:

ExecutorService executor =
    new ThreadPoolExecutor(N_THREADS, N_THREADS, 0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>(CAPACITY),
        new ThreadPoolExecutor.CallerRunsPolicy());
executor服务执行器=
新的ThreadPoolExecutor(N个线程,N个线程,0L,TimeUnit.ms,
新的LinkedBlockingQueue(容量),
新的ThreadPoolExecutor.CallerRunPolicy());

您只是想知道这是否可能?对吗?这是可能的!!谷歌有点难。暗示
BlockingQueue
ThreadPoolExecutor
。将拒绝策略添加到Google关键字列表中。谢谢,我得到了答案!相关@MarkoTopolnik:Where是对它的支持?@MarkoTopolnik:
Executor
接口只有一个方法
void execute(Rnnable)
,那么您所说的方法在哪里?