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

时间:2014-02-26 12:57:09

标签: java executorservice executor

我知道我可以使用

指定固定线程池大小
ExecutorService executor = Executors.newFixedThreadPool(10);

我可以将runnable对象添加到执行程序中,只要线程在池中空闲

,它们就会执行
executor.execute(Obj);

我想要limit the no of objects to be added to the executor service,即如果我有100个可运行的对象,则线程池大小为10,并且只有20个必须添加到ExecutorService,其余部分必须被拒绝。

I want to create a fixed size waiting list for the executor因此,它不是要添加所有100个对象并使它们处于等待状态,而是必须保持固定的no项目处于等待状态

我浏览了Executor和ExecutorService API,但没有找到任何这样的东西,只是想知道这是否可能?

3 个答案:

答案 0 :(得分:2)

查看ThreadPoolExecutor的构造函数。您可以向执行人提供有界队列和拒绝政策。拒绝策略告诉执行程序当您尝试提交的任务超出其处理范围时该怎么做。

示例:

ExecutorService executor =
    new ThreadPoolExecutor(N_THREADS, N_THREADS, 0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>(CAPACITY),
        new ThreadPoolExecutor.CallerRunsPolicy());

答案 1 :(得分:1)

所有Executor服务 - 单个,固定,缓存的线程池都由通用执行程序ThreadPoolExecutor支持。

您可以按如下方式覆盖执行方法:

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);
    }
}

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

答案 2 :(得分:0)

尝试将ExecutorExecutorService包裹在:

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();
    }
}

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