线程框架关系:
Executor 接口
ExecutorService 接口 继承 Executor
AbstractExecutorService 抽象类 实现 ExecutorService
ThreadPoolExecutor 继承AbstractExecutorService 重载一系列方法
Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数为Runnable类型,从字面意思可以理解,就是用来执行传进去的任务的;
ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;
ThreadPoolExecutor类中有几个非常重要的方法:
execute():向线程池提交一个任务。在Executor声明
submit():向线程池提交一个任务,有返回结果(future).在ExecutorService声明,AbstractExecutorService 实现,而ThreadPoolExecutor并没有重写
shutdown():用来关闭线程池的。线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕;
shutdownNow():用来关闭线程池的。则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务;
ThreadPoolExecutor:参数解析
1.int corePoolSize:核心池的大小
线程池初始化时,线程池没有任何线程(线程数为0),等有任务来,才创建线程去执行任务(除非显示调用prestartAllCoreThreads()或者prestartCoreThread())。
当线程池中的线程数据达到该值,后面来的任务,将放在缓存队列中
2.int maximumPoolSize: 线程池最大线程数
3.long keepAliveTime:线程存活时间
线程空闲最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用。即当线程池中的线程数大于corePoolSiz时,
如果一个线程空闲的时间达到keepAliveTime,则会终止。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize,
keepAliveTime参数也会起作用,直到线程池中的线程数为0;
4.TimeUnit unit:单位
5.BlockingQueue<Runnable> workQueue:工作队列
ArrayBlockingQueue;LinkedBlockingQueue;SynchronousQueue;
6.ThreadFactory threadFactory: 线程工厂,主要用来创建线程;
7.RejectedExecutionHandler handler:表示当拒绝处理任务时的策略
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
线程池状态:
RUNNING/SHUTDOWN/STOP
当创建线程池后,初始时,线程池处于RUNNING状态;
如果调用了shutdown()方法,则线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕;
如果调用了shutdownNow()方法,则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务;
当线程池处于SHUTDOWN或STOP状态,并且所有工作线程已经销毁,任务缓存队列已经清空或执行结束后,线程池被设置为TERMINATED状态。
corePoolSize,maximumPoolSize,workQueue之间关系
1.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
2.当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭