当前位置: 首页 > 面试题库 >

Java:ExecutorService在特定队列大小后会在提交时阻止

西门安宁
2023-03-14
问题内容

我正在尝试编写一个解决方案,其中单个线程会生成可并行执行的I / O密集型任务。每个任务都有重要的内存数据。因此,我希望能够限制当前待处理的任务数。

如果我这样创建ThreadPoolExecutor:

    ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>(maxQueue));

然后,当队列已满并且所有线程都已经繁忙时,executor.submit(callable)抛出该异常RejectedExecutionException

executor.submit(callable)当队列已满并且所有线程都忙时,我该怎么做才能阻塞?

编辑 :我试过了:

executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

它以某种微妙的方式达到了我想要达到的效果(基本上被拒绝的线程在调用线程中运行,因此这阻止了调用线程提交更多信息)。

编辑:(问了问题5年后)

对于阅读此问题及其答案的任何人,请勿将接受的答案作为一种正确的解决方案。请通读所有答案和评论。


问题答案:

我也做过同样的事情。诀窍是创建一个BlockingQueue,其中offer()方法实际上是put()。(您可以使用所需的任何基本BlockingQueue隐式表示形式)。

public class LimitedQueue<E> extends LinkedBlockingQueue<E> 
{
    public LimitedQueue(int maxSize)
    {
        super(maxSize);
    }

    @Override
    public boolean offer(E e)
    {
        // turn offer() and add() into a blocking calls (unless interrupted)
        try {
            put(e);
            return true;
        } catch(InterruptedException ie) {
            Thread.currentThread().interrupt();
        }
        return false;
    }

}

请注意,这仅适用于线程池,corePoolSize==maxPoolSize因此请注意此处(请参见注释)。



 类似资料:
  • 我正在尝试编写一个解决方案,其中单个线程产生可以并行执行的I/O密集型任务。每个任务都有重要的内存数据。所以我希望能够限制一次挂起的任务数量。 如果我像这样创建ThreadPoolExecator: 然后是执行器。submit(可调用)在队列已满且所有线程都已忙时抛出RejectedExecutionException。 我该怎么做才能成为执行者。提交(可调用)在队列已满且所有线程都忙时阻止? 编

  • 我不知所措。我有一个阻塞请求 此代码通常会阻塞<code>队列。takeFirst()当队列中没有项目时。但是,一旦我按预期添加了项目,它就不会解除阻止。调试时,我可以看到中的项目,并且当我停止Tomcat时,我会序列化。启动后,我将对队列进行反序列化,并在那一点上对<code>队列进行反串行化。takeFirst()检索项目(与之前未检索的相同)并提交它。 有人有什么想法吗? 编辑 再强调一下我

  • 本文向大家介绍Git 在特定日期提交,包括了Git 在特定日期提交的使用技巧和注意事项,需要的朋友参考一下 示例 该--date参数设置作者日期。例如,此日期将出现在的标准输出中git log。 还要强制提交日期: date参数接受GNU date支持的灵活格式,例如: 当日期未指定时间时,将使用当前时间,仅日期将被覆盖。

  • 问题内容: 我搜索了一堆页面,但是找不到我的问题,所以我不得不发表一个帖子。 我有一个带有提交按钮的表单,提交后我不希望它刷新或重定向。我只希望jQuery执行功能。 形式如下: 这是jQuery: 问题答案: 只需处理Submit事件中的表单提交,然后返回false: 您不再需要提交按钮上的onclick事件:

  • 问题内容: 我一直在查看我的elasticsearch日志,但遇到了错误 查找错误后,普遍的共识是增加队列的大小,如此处所述-https: //www.elastic.co/guide/en/elasticsearch/reference/current/modules- threadpool.html 我的问题是实际上该如何做?我缺少某处的配置文件吗? 问题答案: 要更改队列大小,可以将其添加到

  • 输入样本: 第一行=组数,N 以下N行=第一个数字是K组中元素的#,以下K个数字是元素本身(范围为0…999999) 停止输入之前的所有行=排队或出列查询。如果排队,则您正在将当前正在处理的元素E排队,在A处。如果队列中没有与E或B属于同一“组”的元素,则在队列的末尾。位于与E属于同一“组”的最后一个元素的正后方 出列很简单,只需从队列中删除第一个元素。对于每个出列查询,输出出列的元素。 一个元素