java线程池学习(二)
new Thread 弊端:
1、每次new Thread 新建对象,性能差
2、线程缺乏统一管理,可能无限制的新建线程,相互竞争,可能占用过多的系统资源导致死机或者OOM
3、缺少更多的功能,如更多执行、线程中断等
线程池--ThreadPoolExecutor
corePoolSize: 核心线程数量
maxinumPool: 线程最大线程数
workqueue: 阻塞队列,存储等待执行的任务,很重要,对线程池产生重大的影响 。
keepaliveTime: 线程没有任务执行时,最多保持多久时间终止 。
unit: keepalivetime 的时间单位
threadFactory: 线程工厂,用来创建线程池使用的 。
rejectHeader: 当拒绝处理任务时的策略
线程池的几个状态:
1、 running : 接受新提交的任务,也能处理阻塞队列中的任务
2、shutdown: 不能接受新提交的任务,但是可以处理线程池中正在等待的任务
3、stop: 不能接受新提交的任务,也不能处理阻塞队列的任务
4、tidying : 如果所有的任务都终止了,有效线程数为0 ,线程池会进入到该状态
execuor: 提交任务,交给线程池执行
submit : 提交任务,能够返回执行结果
shutdown: 关闭线程池,等待所有的任务执行完
shotdownnow: 关闭线程池,不等待所有的任务执行完
gettaskcount : 获取已经执行和还没有执行的任务
getcompletedTaskCount(): 获取已经执行完成的线程数量
getpoolsize: 线程池当前的线程数量
getactivecount: 当前线程池中正在执行的线程数量
Executors.newCacheThreadPool : 创建一个可缓存的线程池,可以动态的扩展内存大小,并将使用完的内存资源进行回收
Executors.newFixedPool : 创建一个定长的线程池 ,可控制线程的最大并发数,超出的线程在队列中等待
Executors.newScheduledThreadpool: 创建的已是一个订场的线程池,可以做到定时和周期性的执行任务。
Executors.newSingleThreadExecutor: 单线程的线程池,所有的任务只能按照固定的顺序去执行
线程池的合理配置:
1、 CPU密集型任务,需要尽量压榨CPU的资源,参考值可以设置为NCPU+1
2、IO密集型的任务,参考值可以设置为2*NCPU