美文网首页
对java线程池的通俗理解

对java线程池的通俗理解

作者: JarryLeo | 来源:发表于2019-01-11 11:17 被阅读17次

    把线程池(ThreadPoolExecutor)理解为一个工厂:
    创建这个工厂的规定:

       - int corePoolSize :正式工数量      
       - int maximumPoolSize :最多工人数量(正式工+临时工)    
       - long keepAliveTime :工人多久不干活就辞退     
       - TimeUnit unit :上面工人不干活时间的单位     
       - BlockingQueue<Runnable> workQueue :工厂订单列表      
       - ThreadFactory threadFactory  : 工厂人事部 (招工-创建线程用)    
       - RejectedExecutionHandler handler :工厂灾害处理单位 
    

    下面对Executors 快速创建的几类线程池解读:

    1.缓存线程池:

    Executors.newCachedThreadPool();
    它的创建方法:

      return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                          60L, TimeUnit.SECONDS,
                                          new SynchronousQueue<Runnable>());
    

    解读:

    这家工厂没有正式员工,所有员工都是零时工,可以无限招工,没有工人数量上限,工人60秒没干活就辞退,可以无限接订单;创建的时候可以自定义人事部,灾害处理单位是ThreadPoolExecutor默认的new AbortPolicy(),订单列表满了,抛出RejectedExecutionException异常,并拒绝新的订单,由于该工厂的订单列表是无限的,所以基本不会用到灾害处理单位;

    2.固定线程池

    Executors.newFixedThreadPool(int nThreads)
    它的创建方法:

    return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>());
    

    解读:

    这家工厂在创建时候,必须指定正式工数量,并且严格不招收零时工,这里不是不干活立马辞退,而是永远不辞退正式工,可以无限接订单;创建的时候可以自定义人事部,灾害处理单位是ThreadPoolExecutor默认的new AbortPolicy(),订单列表满了,抛出RejectedExecutionException异常,并拒绝新的订单,由于该工厂的订单列表是无限的,所以基本不会用到灾害处理单位;

    3.定时任务线程池

    Executors.newScheduledThreadPool(int corePoolSize);

    它的创建方法:

    return new ScheduledThreadPoolExecutor(corePoolSize);
    
    //ScheduledThreadPoolExecutor是继承ThreadPoolExecutor的类
    //ScheduledThreadPoolExecutor的构造:
    super(corePoolSize, Integer.MAX_VALUE,
                  DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
                  new DelayedWorkQueue());
    
    

    解读:

    这家工厂在创建时候,必须指定正式工数量;但是它可以无限制招收零时工;10毫秒不干活就辞退!该工厂的订单列表也是无限的,但是具有优先级,可以指定时间开工的订单;创建的时候可以自定义人事部;

    4.单线程线程池

    Executors.newSingleThreadExecutor();

    它的创建方法:

      return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue<Runnable>()));
    

    通俗解读:

    该工厂只有一个工人,不招收零时工,嗯?感觉就是一个自由职业者,不是一个工厂,不存在辞退问题,可以无限制接单,可以自定义人事部,默认的灾害处理单位,用不上;该工厂有个特点,订单没完成的时候,工人死掉了(异常)它会自动再招个工人继续完成工作,并且在没有工作时候,会被垃圾回收装置关闭工厂。

    相关文章

      网友评论

          本文标题:对java线程池的通俗理解

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