1.概述
如果并发的线程过多,而且执行的时间都非常短,如果这样,每次都要创建线程就会大大降低效率,我们可以通过线程池来解决,JDK5增加了内置线程池ThreadPollExecutor。
2.线程池的优点
1.重复利用,降低了线程频繁创建销毁消耗的时间。
2.统一的线程管理,由线程池来负责。
3.ThreadPollExecutor构造方法中各个参数的意义
-
corePoolSize:核心池的大小,默认情况下,刚创建出线程池,线程池的大小为0,来一个任务创建一个线程,除非事先创建好预备的线程。
-
maximumPoolSize:线程池的最大线程数,核心和非核心线程的总和。
-
keepAliveTime:非核心池中非核心线程的保存时间。
-
unit:keepAliveTime的时间单位。
-
workQueue:一个阻塞的队列,里面存放的是等待到核心池获取线程的任务。
-
threadFactory:线程工厂,用来创建线程。
-
handler:表示拒绝处理任务的策略,有四种。
4.线程池的执行
执行流程:
当一个任务要被执行时,会先看核心线程池是否已满,如果未满,则从核心池中获取线程,如果核心池满了,则尝试去添加到队列中,等待获取核心线程中中的资源,如果队列已满,则看非核心线程池是否已满,如果未满,则从非核心线程池中获取线程,如果非核心线程都满了,则需要执行拒绝任务的策略。
5.线程池中的队列
-
ArrayBlockingQueue:有一个数组实现的有界队列,创建时必须设置初始大小,按照先来后到的方式执行。
-
LinkedBlockingQueue:基于链表实现的队列,默认容量是Integer.MAX_VALUE,也可手动设置,按照先来后到的方式执行。
6.线程池的4种拒绝策略
-
AbortPolicy:直接抛出异常,阻止正常的工作。
-
DiscardOleddestPolicy:丢弃等待时间最长的任务。
-
DiscardPolicy:直接丢弃,不执行。
-
CallerRunsPolicy:交由提交任务的线程执行任务(例如:main)。
7.execute 与 submit 执行任务的区别
execute没有返回值,submit有返回值,通过get方法获取。
8.shutdownNow和shutdown关闭线程池方法的区别
shutdownNow表示现在立刻停止所有任务,对等待执行的任务全部取消。
shutdown表示停止再接收新的任务,还未执行完的任务继续执行。