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

使用线程池需要注意的点

作者: 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