多线程学习——线程池

多线程学习——线程池

Scroll Down

多线程学习——线程池

1.什么是线程池?

线程池通过用队列管理任务统一调度线程的工具

2.线程池的常见参数

corePoolsize
	核心线程数
maxPoolsize
	最大线程数
keepAlivetime
	保持存活时间
workqueue
	任务队列
		synchronousQueue
			直接交换
			不会存任务
		linkedBolckQueue
			无界队列
		ArrayBlockQueue
			有界队列
threadFactory
	线程工厂
Handler
	如果线程池无法处理任务 拒绝策略

3.线程池添加线程的规则

如果线程数小于corepoolsize,即使其他线程空闲也会创建新的线程来运行任务
如果线程数等于或大于corepoolsize但小于队列的数,则会将任务放入队列中
如果队列已满,并且线程数小于maxPoolsize,则会创建线的线程数
如果队列已满,线程数大于或等于maxPoolsiez则会拒绝任务

特点:

corePoolsize=maxPoolsize
	固定长度线程池
线程池希望保持较小的线程数
maxPoolsize很大
	那么会创建很多线程
无界队列
	线程数不会超过队列数

4.常见的线程池

1.newFixedThreadPool

定长的线程池
阻塞队列
会造成任务挤压 OOM异常
参数
	corePoolsize
		传入
	maxPoolsize
		传入
	keepAlivetime
		0

2.newSingleThreadPool

阻塞队列
线程数为1
会造成任务挤压 OOM异常
参数
	corePoolsize
		1
	maxPoolsize
		1
	keepAlivetime
		0

3.newCachedThreadPool

直接交换
会回收队列
最大线程数为整形最大值
参数
	corePoolsize
		0
	maxPoolsize
		interger.max
	keepAlivetime
		60

4.newScheduleThreadPool

定时线程
参数
	corePoolsize
		传入
	maxPoolsize
		interger.max
	keepAlivetime
		0

4.workingstealThreadPool(1.8)

该线程池会将任务会发为子任务

5.手动设置线程池参数

线程池的线程数量:

CPU密集的任务(加密运算,计算hash)
	最佳线程数为CPU核心的1-2倍
耗时IO型(读取数据库 读取文件 网络读写) 
	最佳线程会大于CPU核心数的很多倍

6.线程池的停止方法

shutdown
	停止接受任务 但是会把任务队列中的任务处理完在停止
isshutdown
	标记线程池是否关闭  只有执行了shutdown方法就为true
isTerminated
	标记整个线程池是否还在运行  只有完全处理完剩余的任务 才为true
awaitTermination
	在一段时间后  查看线程池是否执行完毕
shutdownNow
	立即中断
	返回队列中的未执行的任务

7.线程池拒绝策略

abortPolicy
	将拒绝信息返回
discardPolicy
	不返回拒绝信息
discardOldestPolicy
	将老的任务丢弃
CallerRunerPolicy
	任务由主线程完成
	给线程池缓冲下

5.线程池的组成和状态

组成
	线程池管理器
	队列
	工作线程
	任务接口
状态
	running
	shutdown
	stop
	tidying
	terminated