线程池:
在多线程环境中,如果并发的线程数量很多,并且每一个线程执行很短的时间就结束了, 频繁地创建线程和销毁线程是需要时间,这样会很大程度上降低系统的效率。而线程池使得线程可以复用,执行完一个任务,并不被销毁,而是继续执行其他的任务。
核心类:ThreadPoolExecutor
ThreadPoolExecutor继承于AbstractExecutorService ,提供了4个构造器。
ThreadPoolExecutor、AbstractExecutorService、ExecutorService和Executor几个之间的关系:
ThreadPoolExecutor继承于AbstractExecutorService. AbstractExecutorService实现了ExecutorService接口,而ExecutorService又继承了Executor接口,Executor接口只有一个execute()方法
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);
...
}
各个参数的含义:
corePoolSize:核心池的大小。默认情况下,创建线程池后,线程池中没有任何线程,线程数为0,需要提交任务后才会创建线程,当有任务到来时,就会创建一个线程去执行任务,当到达线程池中的线程数目达到corePoolSize时,会把到来的任务放到缓冲队列中。
maxMunPoolSize:线程池的最大线程数,表示线程池中最多能创建多少个线程。
keepAliveTime:线程没有执行任务时最多保持多长时间会终止。一般情况下,当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用。
unit:参数keepAliveTime的时间单位
线程池状态:
ThreadPoolExecutor类中定义了一个volatile修饰的变量: volatile int runState,其中有4个static final int类型的值
0-----Running:创建线程池后,进入到running状态,将任务放入任务缓存队列workQueue。
1-----ShutDown:调用了shutdown()方法,此时不会接收新的任务,并且等待所有任务执行完毕。
2-----Stop:调用了shutdownNow()方法,此时不会接收新的任务,并且会尝试终止正在执行的任务。
3----Terminated:当线程池处于ShutDown或者Stop状态,并且所有的工作线程已经销毁。任务缓存队列已经清空或者执行结束后,被设为terminated状态。
任务缓存队列:workQueue
是一个阻塞队列,存放等待执行的任务,用的比较多的是LinkedBlockingQueue,基于链表的先进先出队列。
workQueue的三种类型:
1)ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小;
2)LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;
3)synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。
任务拒绝策略:
当任务缓存队列已满并且线程池中的线程数目达到maxMumPoolSize,若有任务到来,采取任务拒绝策略。
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
关闭线程池:
shutdown():不会立即终止线程池,等消息缓存队列中的任务都执行完毕后才终止,但是也不会接收新的任务。
shutdownNow():立即终止线程池,并且尝试大端正在执行的任务,清空缓存队列,返回尚未执行的任务。
看了好长时间线程池,里面内容超级多,更多东西还是参照下面大神的博客吧。