Java基础: 手动创建线程池

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

1. FixedThreadPool或者SingleThreadPool 

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

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

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

2. CachedThreadPool

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

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

生产环境的做法:

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<Runnable>(1024));

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值