zoukankan      html  css  js  c++  java
  • 看看Java线程池的底层实现

    Java线程池的底层实现

    查看Executors工具类中newCachedThreadPool(), newSingleThreadExcecutor(), newFixedThreadPool()源码:

       public static ExecutorService newCachedThreadPool() {
            return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                          60L, TimeUnit.SECONDS,
                                          new SynchronousQueue());
    }
    
    该线程池在极端情况下,每次提交新的任务都会创建新的线程执行. 适合用来执行大量耗时短并且提交频繁的任务
    复制代码
        public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue());
        }
        public static ExecutorService newSingleThreadExecutor() {
            return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue()));
        }

    Excutors工具类中返回线程池的方法底层都使用了ThreadPoolExecutor线程池,这些方法都是ThreadPoolExecutor线程池的封装。

    ThreadPoolExecutor的构造方法:
        public ThreadPoolExecutor(int corePoolSize,
                                       int maximumPoolSize,
                                       long keepAliveTime,
                                       TimeUnit unit,
                                       BlockingQueue workQueue,
                                       ThreadFactory threadFactory,
                                       RejectedExecutionHandler handler)

    各个参数含义:

    • corePoolSize, 指定线程池中核心线程的数量。
    • maxinumPoolSize,指定线程池中最大线程数量。
    • keepAliveTime,当线程池线程的数量超过corePoolSize时,多余的空闲线程的存活时长,即空闲线程在多长时长内销毁。
    • unit, 是keepAliveTime时长单位。
    • workQueue,任务队列,把任务提交到该任务队列中等待执行。
    • threadFactory,线程工厂,用于创建线程。
    • handler拒绝策略,当任务太多来不及处理时,如何拒绝。

    说明:

    workQueue工作队列是指提交未执行的任务队列,它是BlockingQueue接口的对象,仅用于存储Runnable任务。

    根据队列功能分类,在ThreadPoolExecutor构造方法中可以使用以下几种阻塞队列:

    1、直接提交队列,由SynchronousQueue 对象提供,该队列没有容量,提交给线程池的任务不会被真实的保存,总是将新的任务提交给线程执行,如果没有空闲线程,则尝试创建新的线程,如果线程数量已经达到maxinumPoolSize规定的最大值则执行拒绝策略。

    2、有界任务队列,由ArrayBlockingQueue实现,在创建ArrayBlockingQueue对象时,可以指定一个容量. 当有任务需要执行时,如果线程池中线程数小于corePoolSize核心线程数则创建新的线程;如果大于corePoolSize核心线程数则加入等待队列.如果队列已满则无法加入,在线程数小于maxinumPoolSize指定的最大线程数前提下会创建新的线程来执行,如果线程数大于maxinumPoolSize最大线程数则执行拒绝策略。

    3、无界任务队列,由LinkedBlockingQueue对象实现,与有界队列相比,除非系统资源耗尽,否则无界队列不存在任务入队失败的情况. 当有新的任务时,在系统线程数小于corePoolSize核心线程数则创建新的线程来执行任务;当线程池中线程数量大于corePoolSize核心线程数则把任务加入阻塞队列。

    4、优先任务队列是通过 PriorityBlockingQueue实现的,是带有任务优先级的队列,是一个特殊的无界队列.不管是ArrayBlockingQueue队列还是LinkedBlockingQueue队列都是按照先进先出算法处理任务的.在PriorityBlockingQueue队列中可以根据任务优先级顺序先后执行。

     

    作者:鲁班快跑

    出处:https://www.cnblogs.com/zhusf/p/15513241.html

    版权:本文版权归作者和博客园共有

    转载:您可以随意转载、摘录,但请在文章内注明作者和原文链接。

  • 相关阅读:
    evernote100个做笔记的好方法
    平衡二叉树的调整模版
    晨间日记的奇迹
    hdu 2952 Counting Sheep
    hdu 1535 Invitation Cards
    poj 3259 Wormholes(spfa)
    poj 2263 Heavy Cargo(floyd)
    poj 3268 Silver Cow Party(SPFA)
    hdu 1690 Bus System
    hdu 3631 Shortest Path(Floyd)
  • 原文地址:https://www.cnblogs.com/zhusf/p/15513241.html
Copyright © 2011-2022 走看看