zoukankan      html  css  js  c++  java
  • 26_线程池_ThreadPoolExecutor

    【ThreadPoolExecutor简述】

    无论是Executors类的newFixedThreadPool()、newSingleThreadExecutor(),还是newCachedThreadPool()方法,虽然看起来创建的线程有着完全不同的特点,期内部实现均使用了ThreadPoolExecutor实现。

    下面展示一下Executors类中对应的以上几个静态方法的源码:

    [ newFixedThreadPool()方法 ]

    [ newSingleThreadExecutor()方法]

    [ newCachedThreadPool()方法 ]

    【ThreadPoolExecutor构造方法】

    以上线程池的实现代码可以看到,他们都是ThreadPoolExecutor类的封装。

    ThreadPoolExecutor类功提供了四个构造方法

    public class ThreadPoolExecutor extends AbstractExecutorService {
        
        public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
                BlockingQueue<Runnable> workQueue);
     
        public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
                BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
     
        public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
                BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);
     
        public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
            BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
        
    }

    【参数详解】

    * courePoolSize 

    指定了线程池中的线程数量。默认情况下,线程池中没有任何线程,而是等待有任务到来才去创建线程并执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这两个方法名字可以看出,就是预创建线程的意思,即在任务到来之前就创建了corePoolSize个线程或者1个线程。默认情况下,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务。当线程池的线程数目达到corePoolSize后,就会把达到的任务放到缓存队列当中。

    * maximumPoolSize

    指定了线程池中最大线程数量。它表示线程池最多能创建多少个线程。

    * keepAliveTime

    表示线程池中的线程没有任务执行时最多或保留多久时间会终止。

    默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,即超过corePoolSize的空闲线程,在多长的时间内,会被销毁。

    * unit 

    参数keepAliveTime的时间单位,有7种取值

    TimeUnit.DAYS;              //
    TimeUnit.HOURS;             //小时
    TimeUnit.MINUTES;           //分钟
    TimeUnit.SECONDS;           //
    TimeUnit.MILLISECONDS;      //毫秒
    TimeUnit.MICROSECONDS;      //微妙
    TimeUnit.NANOSECONDS;       //纳秒

    * workQueue

    一个阻塞任务队列,用来存储等待执行的任务,这个参数的选择非常重要,会对线程池的运行过程产生较大影响。

    一般可以选择如下:

    ArrayBlockingQueue;    //使用较少
    LinkBlockingQueue;      //经常使用
    SynchronousQueue;     //经常使用

    * threadFactory

    线程工厂,主要用来创建线程,一般选择默认即可

    * handler  

    拒绝策略,当任务太多时,如何拒绝任务。

    一共有以下取值:

    ThreadPoolExecutor.AbortPolicy //直接丢弃任务,抛出RejectedExecutionException异常,阻止系统工作
    ThreadPoolExecutor.DiscardPolicy //丢弃任务,不予任何处理,不抛出异常
    ThreadPoolExecutor.DiscardOldestPolicy  //丢弃最老的一一个任务,即队列最前面的任务,然后重新尝试执行任务,并重复此过程
    ThreadPoolExecutor.CallerRunsPolicy  //由调用线程处理该任务
  • 相关阅读:
    java中怎么解决路径中文的问题
    Json
    ajax
    MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法
    关于web.xml的格式
    关于RuntimException
    JNDI
    Dreamweaver使用过程的小技巧
    web-service客户端与服务器端的连接
    Python3
  • 原文地址:https://www.cnblogs.com/HigginCui/p/8831126.html
Copyright © 2011-2022 走看看