美文网首页
使用线程池需要注意的点

使用线程池需要注意的点

作者: powerjiajun | 来源:发表于2019-02-27 11:41 被阅读0次

《阿里巴巴java开发手册》中关于线程池的创建有一段话:
线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

关于Executors和ThreadPoolExecutor具体的区别是什么呢?

Executors 返回的线程池对象的弊端如下:
FixedThreadPool 和 SingleThreadPool : 允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积大量的请求,从而导致 OOM 。
CachedThreadPool 和 ScheduledThreadPool : 允许的创建线程数量为 Integer.MAX_VALUE ,可能会创建大量的线程,从而导致 OOM 。

综上所述,虽然Executors的初衷是为了让我们更方便地、无需了解线程数细节的前提下也能用好线程池,但是实际使用中似乎并不如意,还是得用回原生线程池ThreadPoolExecutor 。
关于ThreadPoolExecutor各个参数的含义,可参考我的线程池总结文章:
https://www.jianshu.com/p/f4f589590eb1

以下是一个使用原生线程池的创建过程,可以看到对于核心线程数、最大线程数、存活时间、线程池和等待队列都满了后的拒绝回调方法都可以控制到,操作十分细腻。

public static void main(String[] args) {
    ArrayBlockingQueue queue = new ArrayBlockingQueue(20);
    ThreadPoolExecutor exec = new ThreadPoolExecutor(10, 15, 60, TimeUnit.SECONDS, queue, new RejectedExecutionHandler() {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            logger.info("线程池已到达最大线程数,等待队列已填满,拒绝当前加入线程");
        }
    });
}

相关文章

网友评论

      本文标题:使用线程池需要注意的点

      本文链接:https://www.haomeiwen.com/subject/mwvxuqtx.html