有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程java 8 threadPoolExecutor在N个任务后使用return语句阻塞

我使用的ThreadPoolExecutor如下所示:

ThreadPoolExecutor pool = new ThreadPoolExecutor(cores, 50, 30L,
TimeUnit.SECONDS, new   ArrayBlockingQueue<>(10));

以及:

pool.execute(()->{

//code goes here

if(some condition){
  return;
}
//code goes here
})

当启用这个带有return语句的block时,所有这些任务都会卡在TPE中。TPE说它已经完全加载,并且总是抛出RejectedExecutionException异常

我不明白为什么会这样。例如,如果您有一个大小为10的池,并且您有100个任务,其中10个任务将匹配if section,您将不接受第101个任务,接下来的所有任务都将被拒绝。为什么?


共 (1) 个答案

  1. # 1 楼答案

    您没有正确配置ThreadPoolExecutor

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue)
    

    使用给定的初始参数、默认线程工厂和被拒绝的执行处理程序创建新的ThreadPoolExecutor。使用Executors工厂方法之一而不是此通用构造函数可能更方便

    参数:

    corePoolSize-池中要保留的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut

    maximumPoolSize-池中允许的最大线程数

    keepAliveTime-当线程数大于核心数时,这是多余空闲线程在终止前等待新任务的最长时间

    unit-keepAliveTime参数的时间单位

    workQueue-用于在任务执行之前保存任务的队列。此队列将仅包含execute方法提交的可运行任务

    我从未见过workQueue大小(10)小于maximumPoolSize(50)的TPE。在当前配置中,由于队列大小为10(此时的队列大小),第11个工作任务将被拒绝

    增加你的workQueue大小以摆脱RejectedExecutionException。50个线程可以轻松处理1000多个小型辅助任务。根据您的要求,使用合理的值配置此队列大小