ThreadPoolExecutor 线程池

来源:互联网 发布:unity3d 透明shader 编辑:程序博客网 时间:2024/06/05 19:08

ThreadPoolExecutor 线程池:用于并发编程,当有多个线程任务需要执行时

 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,线程池能够使得线程可重复利用,执行完任务后线程不会立即被销毁而是继续执行其他的任务
 

  • 构造方法
/*** 构造方法一**/ public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,                           long TimeUnit unit,  BlockingQueue<Runnable> workQueue) {}         //int corePoolSize, 核心线程数量()         //int maximumPoolSize,最大线程数量(核心线程数量+临时线程数量)         //long keepAliveTime,线程完成任务当前没有任务时的闲置时间,若超过闲置时间还是没有任务,该线程将被销毁         //long TimeUnit unit, 等待时间单位(可以是TimeUnit.DAYS天,HOURS,MINUTES,SECONDS,MILLISECONDS等                        //BlockingQueue<Runnable> workQueue 阻塞队列(任务缓存队列),用来储存等待执行的任务有三种          //          ArrayBlockingQueue:基于数组的先进先出原则,创建时必须只能队列的大小         //          LinkedBlockingQueue:基于链表的先进先出原则,创建时可指定大小,默认大小为Integer.MAX_VALUE;         //          SynchronousQueue:它不会缓存提交的任务,而是将直接新建一个线程来执行新来的任务,数据是在配对的生产者和消费者线程之间直接传递的,并不会将数据缓冲数据到队列中。/*** 构造方法二**/    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,                          long TimeUnit unit,BlockingQueue<Runnable> workQueue,                          ThreadFactory     threadFactory) {}                          //threadFactory 线程工厂,主要用来创建线程/*** 构造方法三**/public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,                          long TimeUnit unit,BlockingQueue<Runnable> workQueue,                          RejectedExecutionHandler handler) {}                          //handler表示当拒绝处理任务时的策略,有四种取值                             //      ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出                         //                    RejectedExecutionException异常。                         //      ThreadPoolExecutor.DiscardPolicy:丢弃任务,但不抛出异常。                         //      ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然                         //                       后重新尝试执行任务(重复此过程)                         //      ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 /*** 构造方法四**/   public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,                          long TimeUnit unit,BlockingQueue<Runnable> workQueue,                          ThreadFactory threadFactory,                          RejectedExecutionHandler handler) {}
  • ThreadPoolExecutor 常使用的方法
threadPoolExecutor.execute(runnable);//向threadPoolExecutor提交任务,runnable为实现了runnable接口的任务;threadPoolExecutor.submit(runnable);//向threadPoolExecutor提交任务,并返回任务执行的结果;threadPoolExecutor.shutdown();//线程池处于SHUTDOWN状态,threadPoolExecutor中已经提交的任务会继续被执行完,但是threadPoolExecutor不会再接受新提交任务threadPoolExecutor.shutdownNow();//线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务,并返回缓存队列中等待被执行任务的集合,缓存队列会被清空 threadPoolExecutor.getQueue();//返回当前threadPoolExecutor的缓存任务队列,主要用于调试程序 threadPoolExecutor.getPoolSize();//当前threadPoolExecutor中线程数量(包括闲置的线程) threadPoolExecutor.getActiveCount();//当前threadPoolExecutor中正在执行任务的线程数量,数量是动态的 threadPoolExecutor.getCompletedTaskCount();//当前threadPoolExecutor中已经执行完毕的任务数量,数量是动态的
  • ThreadPoolExecutor的运行状态
volatile int runState;//runState表示当前线程池状态,是一个可变线程可见的整数 有如下几种取值static final int RUNNING    = 0;//ThreadPoolExecutor被创建时出入RUNNRING状态static final int SHUTDOWN   = 1;//当调用shutdown()后,转为SHUNDOWN状态;static final int STOP       = 2;//当调用shutdownNow()后,转为STOP状态;static final int TERMINATED = 3;//当线程处于SHUTDOWN或STOP状态后,所有线程被执行或销毁,缓存队列中没有任务时转为TERMINATED状态;
  • ThreadPoolExecutor任务处理策略
//***刚开始创建ThreadPoolExecutor时,线程池中没有线程,只有提交任务后才会创建线程//   1.如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;//   2.如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成//     功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的临//     时线程去执行这个任务;//   3.如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;//   4.如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直//     至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲//     时间超过keepAliveTime,线程也会被终止。 
  • 创建线程池方法
/***  方法一**/LinkedBlockingQueue workQueue = new LinkedBlockingQueue(10);ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 500, TimeUnit.MILLISECONDS, workQueue);//可以通过上面四种ThreadPoolExecutor的构造函数来new出ThreadPoolExecutor;/***  方法二 ,它们实际上也是调用了ThreadPoolExecutor,只不过参数都已配置好了。**/Executor threadPool = Executors.newFixedThreadPool(i);//创建固定容量大小的缓冲池,创建的线程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue;Executor threadPool = Executors.newCachedThreadPool(); //创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE,将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。Executor threadPool = Executors.newSingleThreadExecutor(); //创建容量为1的缓冲池,将corePoolSize和maximumPoolSize都设置为1,也使用的LinkedBlockingQueue
0 0
原创粉丝点击