美文网首页
面试刷题20:并发包中的线程池有哪些?

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

作者: 李福春carter | 来源:发表于2020-03-30 16:45 被阅读0次
    image.png

    <br />java提供的线程池可以简化线程管理,提高线程资源的利用率。<br />
    <br />
    <br />大家好,我是李福春,今天的题目是:<br />
    <br />Java提供了哪些线程池?如何设置合适的线程池大小?<br />
    <br />答:java.util.concurrent包中提供了5种线程池,从简单到复杂列举如下:<br />
    <br />一,newSingleThreadExecutor() ,单线程池,任何时候工作线程都是1个,队列是无界队列保证任务的顺序执行;<br />
    <br />二,newFixedThreadPool(int),固定数量的线程池,任何时候工作线程都是N,内部使用的无界队列;<br />
    <br />三,newCachedThreadPool()缓存线程池,适合处理大量短时间执行的任务;<br />
    <br />四,newWorkStealingPool(int)工作窃取线程池,java8引入,内部使用ForkJoinPool实现<br />
    <br />五,newScheduledThreadPool(),适合处理定时或者周期性的任务<br />
    <br />
    <br />如何合理设置线程池大小?<br />
    <br />需要综合计算任务的特点来。<br />cpu耗费较高的,核心线程数一般设置为N(cpu核心数)<br />等待任务较多的,核心线程数一般设置为 Ncpu利用率(1+平均等待时间/平均执行时间)<br />
    <br />同时在使用线程池的时候,注意一下5点:<br />1, 避免任务堆积<br />2,避免过度扩展线程,以及避免线程泄露;<br />3,避免死锁,合理使用各种锁;<br />4,避免使用ThreadLocal;<br />

    image.png

    线程池参数

    <br />线程池的结构如下图:<br />


    image.png

    <br />
    <br />

    file

    <br />5中类型的线程池尽量避免使用前三种,应该自己精确设定线程池的这6个参数。<br />
    <br />原因如下:<br />
    <br />1,newSingleThreadExecutor(),工作队列是无界队列,工作队列超出极限容易引发内存溢出的问题。<br />

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

    <br />
    <br />2, newFixedThreadPool(int) ,工作队列是无界队列,超出极限容易引发内存溢出的问题;<br />

     public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>());
        }
    

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

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

    小结

    <br />本篇回答了java常见的线程池,以及分析了线程池的参数的含义,以及线程池处理模型;<br />
    <br />
    <br />然后简要介绍了如何调优线程池的参数,以及使用的注意问题。<br />

    image.png

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

    相关文章

      网友评论

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

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