线程池的创建
2021-03-28 15:27
标签:illegal getc seconds 参数 exception contex etc trace image 可以发现这几个方法内部都标明了Integer.MAX_VALUE,导致创建时可能会使线程池数量过多,以及允许请求队列的长度过大,造成堆空间堆积,造成OOM 所以推荐使用threadpoolExecutor的构造方法来创建线程池 构造函数重要参数分析 自定义线程池 运行结果 线程池的创建 标签:illegal getc seconds 参数 exception contex etc trace image 原文地址:https://www.cnblogs.com/qingfeng5438/p/13624216.html如何创建线程池??
阿里巴巴开发手册中写道,强制禁用使用Executors工具类来创建线程池,首先看一下Executors
通过上述的几个方法可以创建线程池,在方法内部其实调用threadpool的构造方法来创建 public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue
这也是禁止使用Executors创建线程池的原因threadpoolExecutor分析
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue
1.corepolsize 核心线程数定义了最小同时可以运行线程的数量
2.maximumpoolSize 当队列中存放的任务达到队列容量时,当前可以用时运行的线程数量变为最大线程数
3.workQueue 当新来一个任务时会判断当前运行的线程数是否达到核心线程数,如果达到,则放入队列中public class MyRunnable implements Runnable{
public MyRunnable(int i) {
this.i = i;
}
private int i;
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ new Date() +i);
}
}
public class MyThreadPool {
private static final int corePoolSize = 5;
private static final int maximumPoolSize = 10;
private static final int workQueue = 100;
private static final Long keepAliveTime = 1L;
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize,maximumPoolSize,keepAliveTime, TimeUnit.SECONDS,
new ArrayBlockingQueue(workQueue),
new ThreadPoolExecutor.CallerRunsPolicy());
for (int i = 0; i