• 面试刷题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

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

  • 相关阅读:
    Spring Boot 使用 Dom4j XStream 操作 Xml
    Spring Boot 使用 JAX-WS 调用 WebService 服务
    Spring Boot 使用 CXF 调用 WebService 服务
    Spring Boot 开发 WebService 服务
    Spring Boot 中使用 HttpClient 进行 POST GET PUT DELETE
    Spring Boot Ftp Client 客户端示例支持断点续传
    Spring Boot 发送邮件
    Spring Boot 定时任务 Quartz 使用教程
    Spring Boot 缓存应用 Memcached 入门教程
    ThreadLocal,Java中特殊的线程绑定机制
  • 原文地址:https://www.cnblogs.com/snidget/p/12599523.html
Copyright © 2020-2023  润新知