zoukankan      html  css  js  c++  java
  • 面试刷题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

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

  • 相关阅读:
    Visual C++ 11 中新的并发功能
    Windows Azure Achievements for Visual Studio 发布
    视频:Pariveda解决方案帮助客户使用Windows Azure拓展商机
    ISV博客系列:本帖出自Fielding系统的创始人兼首席执行官
    2012新版微软一站式示例代码浏览器正式发布 包含Windows Azure代码示例!
    现实世界的Windows Azure:采访Soluto的创始人Tomer Dvir
    Hello China操作系统运行截图(完整版)
    ISV客户博客系列:Persistent Systems 使用Windows Azure交付基于Java的CloudNinja项目
    行业操作系统示例汽车操作系统
    上海的主要商务区域
  • 原文地址:https://www.cnblogs.com/snidget/p/12599523.html
Copyright © 2011-2022 走看看