Java基础: 手动创建线程池

发布于:2021-09-18 13:00:56

使用ExecutorServices直接创建线程池的缺点:?


1. FixedThreadPool或者SingleThreadPool?


? ?允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。


public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}

public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()));
}

2.?CachedThreadPool


? ?允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。


public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}

生产环境的做法:


1. 创建线程工厂,指定创建线程时的线程名称的命名规律



ThreadFactory nameThreadFactory = new ThreadFactoryBuilder().setNameFormat(“demo-pool-%d”).build();

2. 创建线程池 ? 线程池在创建时可以不人为指定线程工厂,默认使用的是DefaultThreadFactory




/**
* 各参数含义
* corePoolSize : 线程池中常驻的线程数量。核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会
* 受存活时间 keepAliveTime 的限制,除非将 allowCoreThreadTimeOut 设置为 true。
* maximumPoolSize : 线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。当任务队列为没有设置大小的
* LinkedBlockingQueue时,这个值无效。
* keepAliveTime : 当线程数量多于 corePoolSize 时,空闲线程的存活时长,超过这个时间就会被回收
* unit : keepAliveTime 的时间单位
* workQueue : 存放待处理任务的队列
* threadFactory : 线程工厂
* handler : 拒绝策略,拒绝无法接收添加的任务
*/

?


ExecutorService pool1 = new ThreadPoolExecutor(
5, 200, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(1024));

也可以人为的指定线程工厂


ExecutorService pool2 = new ThreadPoolExecutor(
5, 200 ,0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(1024), namedThreadFactory,
new ThreadPoolExecutor.AbortPolicy());

?

相关推荐

最新更新

猜你喜欢