首页 > 其他分享 >ThreadPoolExecutor创建线程池启动项目报错问题

ThreadPoolExecutor创建线程池启动项目报错问题

时间:2022-12-17 18:12:37浏览次数:46  
标签:java corePoolSize maximumPoolSize 线程 new RELEASE 报错 ThreadPoolExecutor

ThreadPoolExecutor创建线程,如下代码:
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 1, 20, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), new ThreadPoolExecutor.CallerRunsPolicy());

启动项目时,报错如下:
Constructor threw exception; nested exception is java.lang.IllegalArgumentException
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1147) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
... 37 common frames omitted
Caused by: java.lang.IllegalArgumentException: null
at java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:1314) [na:1.8.0_162]
at java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:1272) [na:1.8.0_162]

原因分析:corePoolSize必须小于等于maximumPoolSize,而Runtime.getRuntime().availableProcessors() + 1有可能大于20,这时就会抛出IllegalArgumentException,这可以在源码中看到,如下图:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}

解决。只需要保证corePoolSize总是<=maximumPoolSize即可,如:
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 1, Runtime.getRuntime().availableProcessors()*2, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), new ThreadPoolExecutor.CallerRunsPolicy());
————————————————
版权声明:本文为CSDN博主「打不死的小强lee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wenqiangluyao/article/details/125768360

标签:java,corePoolSize,maximumPoolSize,线程,new,RELEASE,报错,ThreadPoolExecutor
From: https://www.cnblogs.com/telwanggs/p/16989302.html

相关文章

  • 线程常用方法
    线程常用方法介绍1、方法概述方法说明static功能说明注意start()启动一个新线程,在新的线程运行run方法中的代码start方法只是让线程进入就绪,里面代码不一......
  • Python之threading: 带你了解多线程的强大威力!
    前言什么是多线程多线程是指在一个程序中同时创建和使用多个执行流(thread)来执行不同的任务。这样多个任务就可以同时进行,从而提高程序的执行效率。在python使用多线......
  • 一次性能调优记录:压测报错out of memory内存溢出【杭州多测师_王sir】【杭州多测师】
    一次性能调优记录:压测报错out of memory内存溢出1、首先这是一段压测的报错日志截图2、服务器的配置还不错,执行机全64核以上,运存256g以上,服务器80核,512g,所有机器线程数......
  • 创建线程的4种方法
    线程创建方法1、继承Thread,重写run方法 privatestaticvoidone(){classTextendsThread{@Overridepublicvo......
  • python多线程修改共享全局变量不安全
    当需要对全局变量进行更改时,则会出现不安全的情况 #-*-coding:utf-8-*-"""================================================================================......
  • 第十四章《多线程》第8节:线程池
    系统启动一个线程的成本是比较高的,因为启动线程的操作要与操作系统交互。如果程序中需要创建大量生存期较短的线程,那么使用线程池将会大幅度提高程序的运行效率。线程池中保......
  • 第十四章《多线程》第9节:ThreadLocal类
    如果多个线程共用一个对象,那么这个对象的属性值对于这些线程都是相同的。例如有一个a对象,它有一个x属性,如果x属性的值是1,那么对于任何一个线程而言,a对象的x属性都是1。但有......
  • 第十四章《多线程》第7节:线程组
    多个线程可以组成一个线程组,线程组可以对一批线程统一调度和管理,也就是说,控制一个线程组相当于控制这个线程组中所有的线程。Java语言以ThreadGroup这个类来表示线程组这个......
  • 第十四章《多线程》第6节:线程通信
    之前所有的例子中,线程的执行都具有一定的随机性。如果希望线程能够有序的执行,必须使用线程通信技术。Java语言提供了一些线程通信的机制能够保证线程的有序执行,本小节将详细......
  • 第十四章《多线程》第4节:控制线程
    从14.3小节所列举的各个例子可以很明显的看出:线程的执行有一定的随机性,如果不加以适当控制,会导致执行结果的不确定性。实际开发过程中,很多情况下都需要让线程按照程序员期望......