当前位置: 首页 > 知识库问答 >
问题:

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

景稳
2023-03-14

我知道我可以使用

ExecutorService executor = Executors.newFixedThreadPool(10);

我可以将可运行对象添加到executor中,只要池中有线程空闲,它们就会执行

executor.execute(Obj);

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

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

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


共有3个答案

连德水
2023-03-14

尝试用以下内容包装您的执行器或执行服务:

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

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

江华容
2023-03-14

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

您可以按如下方式重写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);
    }
}

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

柳杰
2023-03-14

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

例子:

ExecutorService executor =
    new ThreadPoolExecutor(N_THREADS, N_THREADS, 0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>(CAPACITY),
        new ThreadPoolExecutor.CallerRunsPolicy());
 类似资料:
  • 问题内容: 我认为这是一个非常简单的问题,但我不知道如何正确执行此操作。 我有一个空的arraylist: 我有一些要添加的对象,每个对象必须位于某个位置。但是,有必要可以按每种可能的顺序添加它们。当我尝试此操作时,它不起作用,我得到了: 我曾尝试是填充用,然后做以上。它有效,但是我认为这是一个可怕的解决方案。还有另一种方法吗? 问题答案: 您可以这样做: 将对象2添加到位置2后,它将把对象3移动

  • 我使用(全局声明)同时运行多线程。需要一个小时才能完成任务。因此,我需要获得当前运行的线程详细信息,如活动线程,排队线程和完成线程。 但事情是我需要停止在15分钟内发送新的请求到服务器或调用一些方法。 这里shutdown或shutdowNow停止执行器,但不停止这5个线程。这就是问题所在。所以我需要手动杀死那些线程。如何杀死executor服务中手动附加的线程?

  • 问题内容: 我是Java的初学者,正在尝试创建自定义类的数组。假设我有一个名为car的类,并且我想创建一组称为Garage的汽车。如何将每辆车添加到车库?这就是我得到的: 问题答案: 如果要使用数组,则必须保留一个包含车库中汽车数量的计数器。最好使用而不是数组:

  • 问题内容: require- 要求将另一个控制器传递给当前的指令链接功能。require会传入指令控制器的名称。如果找不到此类控制器,则会引发错误。该名称可以带有以下前缀: ?-不要提出错误。这使得require依赖关系是可选的。 ^-还要在父元素上查找控制器。 以上是官方文档的定义。这里的歧义恰恰是“指令控制器”。 以angularjs-ui引导项目中的tabs指令为例。 该指令有,其中,是它的

  • 我希望能够获得我已经提交给执行服务(特别是线程池执行器)的Callable(因此它们不能通过getQueue())。 我试图创建一个子类来覆盖beForeExecute之前的

  • 注意:我理解规则站点,但我不能把所有代码(复杂/大代码)。 我在Github中添加了一个不同的代码(所有真正的代码都太多了,你在这里不需要),但复制了这个问题(主类是,切换类是),就像视频一样。 请不要向我推荐此代码的其他jar或外部库。 我希望我能说得更具体一些,但我不知道该提取和展示什么部分。在你结束这个问题之前:显然,如果有人告诉我去哪里看(技术细节),我愿意改进我的问题。 我制作了一个视频