• 面试刷题20:并发包中的线程池有哪些?


    image.png


    java提供的线程池可以简化线程管理,提高线程资源的利用率。




    大家好,我是李福春,今天的题目是:


    Java提供了哪些线程池?如何设置合适的线程池大小?


    答:java.util.concurrent包中提供了5种线程池,从简单到复杂列举如下:


    一,newSingleThreadExecutor() ,单线程池,任何时候工作线程都是1个,队列是无界队列保证任务的顺序执行;


    二,newFixedThreadPool(int),固定数量的线程池,任何时候工作线程都是N,内部使用的无界队列;


    三,newCachedThreadPool()缓存线程池,适合处理大量短时间执行的任务;


    四,newWorkStealingPool(int)工作窃取线程池,java8引入,内部使用ForkJoinPool实现


    五,newScheduledThreadPool(),适合处理定时或者周期性的任务




    如何合理设置线程池大小?


    需要综合计算任务的特点来。
    cpu耗费较高的,核心线程数一般设置为N(cpu核心数)
    等待任务较多的,核心线程数一般设置为 Ncpu利用率(1+平均等待时间/平均执行时间)


    同时在使用线程池的时候,注意一下5点:
    1, 避免任务堆积
    2,避免过度扩展线程,以及避免线程泄露;
    3,避免死锁,合理使用各种锁;
    4,避免使用ThreadLocal;

    image.png

    线程池参数


    线程池的结构如下图:

    image.png



    file


    5中类型的线程池尽量避免使用前三种,应该自己精确设定线程池的这6个参数。


    原因如下:


    1,newSingleThreadExecutor(),工作队列是无界队列,工作队列超出极限容易引发内存溢出的问题。

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


    2, newFixedThreadPool(int) ,工作队列是无界队列,超出极限容易引发内存溢出的问题;
     public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>());
        }
    

    3, newCacheThreadPool(),最大线程数太大,容易引起线程泄露;

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

    小结


    本篇回答了java常见的线程池,以及分析了线程池的参数的含义,以及线程池处理模型;




    然后简要介绍了如何调优线程池的参数,以及使用的注意问题。

    image.png

    原创不易,转载请注明出处。

  • 相关阅读:
    LeetCode 905 按奇偶排序数组
    LeetCode 46 全排列
    Django 2随便使用笔记-Day01
    Python函数化编程整理
    Oracle解锁表笔记
    springboot(1)使用SpringBoot基础HTTP接口GET|POST|DELETE|PUT请求
    什么是Restful API
    C# 生成条形码BarCode 128
    ADB shell 的一般操作
    遇到“未能从程序集XXXX...加载类型XXX”的问题
  • 原文地址:https://www.cnblogs.com/snidget/p/12599523.html
Copyright © 2020-2023  润新知