【问题标题】:java 8 threadPoolExecutor stucks after N tasks with return statementjava 8 threadPoolExecutor在带有return语句的N个任务后卡住
【发布时间】:2016-07-07 01:15:51
【问题描述】:

我使用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
})

当启用这个带有返回语句的块时,所有这些任务都会卡在 TPE 中。 TPE 说它已经满载并且总是抛出RejectedExecutionExceptionexception

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

【问题讨论】:

  • 这个描述很难判断出了什么问题……提交的任务有没有被执行?也许您的任务代码中存在某种错误,它们很容易停止......
  • 实际上你不会接受第 11 个任务,因为队列大小为 10

标签: java multithreading java-8 threadpoolexecutor


【解决方案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 方法提交的 Runnable 任务。

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

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

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2014-02-28
    • 2022-01-11
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多