• ThreadPoolExecutor


    可以参考:http://blog.csdn.net/linghu_java/article/details/17123057

    一、AbstractThreadPoolExecutor

        该类是个抽象类,里面实现了ExecutorService的一些默认的实现。

    二、ThreadPoolExecutor(ExecutorService的一个实现)

      

    1、提供了各种的配置参数可以使我们灵活的配置线程池。一般我们使用Executors产生一些参数已经配置好的线程池即可,当需要灵活产生自己的线程池时使用该类自己配置产生)

    2、线程池的参数

        Core pool size   当线程数量小于core size的时候,线程池只会创建新的线程,即使当前线程池里面有线程处于idle       可以通过 setCorePoolSize(int)来进行动态的设定,通过 getCorePoolSize()来查询

        max pool size  线程池的最大线程数量                                                                                                    可以通过 setMaximumPoolSize(int)来进行动态的设定,通过 getMaximumPoolSize()来查询

        On-demand construction   当线程池的线程少于core的时候,线程池里面是没有core线程的,可以 调用 prestartCoreThread()【初始化一个core线程】 or prestartAllCoreThreads()【初始化所有的core线程】

        Creating new threads   默认使用的是 Executors.defaultThreadFactory(),产生的线程是在同一个ThreadGroup,NORM_PRIORITY priority和 non-daemon status。

        Keep-alive times    线程数量大于core时,默认是先使用idle线程,如果没有idle线程而且线程数量小于max,则创建新的线程。当线程数量大于core时,如果一个线程处于idle的时间超过keep-alive times值,则回收该                                线程。通过 setKeepAliveTime(long, java.util.concurrent.TimeUnit).动态设置该参数,通过 getKeepAliveTime(java.util.concurrent.TimeUnit)进行查询。

                                    通过 allowCoreThreadTimeOut(boolean)设置core线程处于idle的时候也能自动回收。

    Queuing

     

           Rejected  Tasks

              当线程池被shutdown或者BlockingQueue(不是unbound的)已经满了的时候,再向线程池提交任务的时候就会调用RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)

            一般有下面几种策略

            

        Hook  method

                    beforeExecute(java.lang.Thread, java.lang.Runnable)

                    afterExecute(java.lang.Runnable, java.lang.Throwable)

           terminated()        【线程池terminate的hook】

                    重写这两个方法可以使得线程池具有一些统计的行为。一般实现自己的线程池,建议继承ThreadPoolExecutor然后Override这三个方法来给线程池增加新的行为。

                    如:

    class PausableThreadPoolExecutor extends ThreadPoolExecutor {
       private boolean isPaused;
       private ReentrantLock pauseLock = new ReentrantLock();
       private Condition unpaused = pauseLock.newCondition();
    
       public PausableThreadPoolExecutor(...) { super(...); }
    
       protected void beforeExecute(Thread t, Runnable r) {
         super.beforeExecute(t, r);
         pauseLock.lock();
         try {
           while (isPaused) unpaused.await();
         } catch (InterruptedException ie) {
           t.interrupt();
         } finally {
           pauseLock.unlock();
         }
       }
    
       public void pause() {
         pauseLock.lock();
         try {
           isPaused = true;
         } finally {
           pauseLock.unlock();
         }
       }
    
       public void resume() {
         pauseLock.lock();
         try {
           isPaused = false;
           unpaused.signalAll();
         } finally {
           pauseLock.unlock();
         }
       }
     }

     Queue maintenance

       通过getQueue()可以获得BlockingQueue,但是不建议对得到的BlockingQueue直接进行操作。该接口一般用于debug。线程池有两个接口 remove(java.lang.Runnable)purge()【移除已经被cnceled的Runnable】来操作Queue。

    如何关闭线程池和回收线程

        当忘记shutdown线程池的时候,可以通过 allowCoreThreadTimeOut(boolean)来回收线程资源。

    一些统计API

               

  • 相关阅读:
    nginx http和https共存
    jQuery prop方法替代attr方法
    idea内置tomcat中java代码热更新
    Linux磁盘空间查看、磁盘被未知资源耗尽
    Mysql order by与limit混用陷阱
    IIS 架构解析
    asp.net MVC 应用程序的生命周期
    Linq专题之var关键字
    ThoughtWorks 2016年第1期DNA活动总结
    对象的深拷贝--反射
  • 原文地址:https://www.cnblogs.com/YDDMAX/p/5206887.html
Copyright © 2020-2023  润新知