线程池定义:是指管理一组同构工作线程的资源池,线程池是与工作队列密切相关的,其中在工作队列中保存了所有等待执行的任务,工作者线程的任务很简单:从一个工作队列中获取一个任务,执行任务,然后返回线程池并等待下一个任务。通过重用现有的线程而不是新建一个线程,可以再处理多个请求时分摊在线程创建和销毁过程中产生的巨大的开销。
线程池的优势:
1.降低资源消耗,通过重复利用已创建的线程降低线程的创建和销毁造成的消耗
2.提高响应速度,当任务到达时,任务可以不需要等线程创建就能立即执行,线程已经创建好了,等待执行
3.提高线程的可管理性,使用线程池可以统一的调优、分配、和监控线程
原理:当任务到来时,把任务给线程池,由线程池去调度线程执行任务
提交线程任务既可以用execute()又可以用submit()方法。
下面创建一个线程池
当队列和线程池都满了,说明线程处于饱和状态,此时必须采取一种措施处理新提交的任务
饱和策略分为:
Abort 策略, 表示无法处理新任务时抛出异常
CallerRuns 策略,只用调用者所在线程执行任务???
Discard策略,不处理,丢弃掉
DiscardOlds策略。丢弃队列中的最新一个任务,并执行当前任务
创建线程构造方法里的一些参数:
函数的参数含义如下:
- corePoolSize: 线程池核心线程数,
- maximumPoolSize:线程池最大数
- keepAliveTime: 空闲线程存活时间
- unit: 时间单位
- workQueue: 线程池所使用的缓冲队列
- threadFactory:线程池创建线程使用的工厂
- handler: 线程池对拒绝任务的处理策略
有如下四个特性
当池中正在运行的线程数(包括空闲线程)小于corePoolSize时,略是抛异常)。
- 新建线程执行任务。当池中正在运行的线程数大于等于corePoolSize时,新插入的任务进入workQueue排队(如果workQueue长度允许),等待空闲线程来执行。
- 当队列里的任务数达到上限,并且池中正在运行的线程数小于maximumPoolSize,对于新加入的任务,新建线程。
- 当队列里的任务数达到上限,并且池中正在运行的线程数等于maximumPoolSize,对于新加入的任务,执行拒绝策略(线程池默认的拒绝策
简单的Java线程池可以从Executors.newFixedThreadPool( int n)获得。此方法返回一个线程容量为n的线程池。然后ExecutorService的execute执行之。