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

Java 如果ThreadPoolExecutor的submit()方法已饱和,如何使之阻塞?

柴禄
2023-03-14
问题内容

我想创建一个ThreadPoolExecutor这样,当它达到最大大小并且队列已满时,该submit()方法将在尝试添加新任务时阻塞。我是否需要为此实现一个自定义RejectedExecutionHandler,或者是否存在使用标准Java库执行此操作的现有方法?


问题答案:

我刚刚发现的可能解决方案之一:

public class BoundedExecutor {
    private final Executor exec;
    private final Semaphore semaphore;

    public BoundedExecutor(Executor exec, int bound) {
        this.exec = exec;
        this.semaphore = new Semaphore(bound);
    }

    public void submitTask(final Runnable command)
            throws InterruptedException, RejectedExecutionException {
        semaphore.acquire();
        try {
            exec.execute(new Runnable() {
                public void run() {
                    try {
                        command.run();
                    } finally {
                        semaphore.release();
                    }
                }
            });
        } catch (RejectedExecutionException e) {
            semaphore.release();
            throw e;
        }
    }
}

还有其他解决方案吗?我更喜欢基于此的东西,RejectedExecutionHandler因为这似乎是处理此类情况的标准方法。



 类似资料:
  • 本文向大家介绍ThreadPoolExecutor 饱和策略?相关面试题,主要包含被问及ThreadPoolExecutor 饱和策略?时的应答技巧和注意事项,需要的朋友参考一下 如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任时, 定义一些策略: :抛出 来拒绝新任务的处理。 :调用执行自己的线程运行任务,也就是直接在调用方法的线程中运行()被拒绝的任务,如果执行程序已关闭,则

  • 问题内容: 使a饱和的最简单方法是什么? 问题答案: 用途: 更新: 确实有一种更简单的方法。您可以使用该类。该类的优点是它提供了一个静态实用程序方法(即),该方法将返回图像的变灰版本。 话虽如此,我认为使实例饱和的最简单方法是:

  • 本文向大家介绍简单谈谈ThreadPoolExecutor线程池之submit方法,包括了简单谈谈ThreadPoolExecutor线程池之submit方法的使用技巧和注意事项,需要的朋友参考一下 jdk1.7.0_79 在上一篇《ThreadPoolExecutor线程池原理及其execute方法》中提到了线程池ThreadPoolExecutor的原理以及它的execute方法。本文解析Th

  • 主要内容:1 submit方法,1.1 Future submit(Runnable),1.2 Future submit(Runnable T),1.3 Future submit(Callable< T >),2 FutureTask的原理,2.1 FutureTask的概述,2.2 FutureTask的重要属性,2.3 FutureTask的构造器,2.4 run核心方法,2.5 cancel取消任务,,,,,,详细介绍了ThreadPoolExecutor线程池的submit方法的源码

  • 本文向大家介绍java  ThreadPoolExecutor使用方法简单介绍,包括了java  ThreadPoolExecutor使用方法简单介绍的使用技巧和注意事项,需要的朋友参考一下 java  ThreadPoolExecutor 前言: 在项目中如果使用发短信这个功能,一般会把发短信这个动作变成异步的,因为大部分情况下,短信到底是发送成功或者失败,都不能影响主流程。当然像发送MQ消息等

  • 如果不使用数组和特殊方法(如方法),如何编写以下方法:输入int表示一个假定为正的数字,输出字符串包含输入字符串的第n个单词,从第一个单词开始,用一个空格分隔。