线程池
一,new Thread 弊端
每次new Thread新建对象,性能差
线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多的系统资源导致死机或OMM
缺少更多功能,如更多执行,定期执行,线程中断
二,线程池的好处
重用存在的线程,减少对象的创建和消亡的开销,新能好
可以有效的控制最大并发线程数,提高系统资源利用率,同时可以避免过多的资源竞争,避免阻塞
提供定时执行,定期执行,单线程,并发数控制等功能
三,相关的类
1.ThreadPoolExecutor
参数:
int corePoolSize:核心线程数量
int maximumPoolSize:线程最大线程数
workQueue:阻塞队列,存储等待执行的任务,很重要,会对线程池的运行过程产生重大影响
long keepAliveTime:线程没有执行任务时最多保持多久时间终止
TimeUnit unit:keepAliveTime的时间单位
ThreadFactory threadFactory:线程工厂,用来创建线程
RejectedExecutionHandler handler:当拒绝处理任务时的策略
2.方法:
execute():提交任务,交给线程池执行
submit():提交任务,能够返回执行结果 execute+Future
shutdown():关闭线程池,等待任务都执行完毕
shutdownNow():关闭线程池,不等待任务执行完
线程监控相关的方法:
getTaskCount():线程池已执行和未执行的任务总数
getCompletedTaskCount():已完成的任务数量
getPoolSize():线程池当前线程的数量
getAliveCount():当前线程池中正在执行任务的线程数量
四,线程池的状态
running:可以处理新提交的任务,并且能处理阻塞队列中的任务
shutdown:关闭状态,不能接受新提交的任务,可以处理阻塞队列中的已经保存的任务。当线程池执行running时调用shutdown()
方法时,可以进入这个状态
stop:不接受新的任务,也不能处理阻塞队列中的任务
tidying:如果所有的人物都已经终止了,工作线程数为0,线程池会进入这个状态
terminated:tidying状态调用 terminated()方法后,会进入这个状态
五,Executor框架接口
Executors.newCachedThreadPool:可缓存的线程池
Executors.newFixedThreadPool:定长线程池,可以控制线程的最大并发数,超出的线程会在线程池中等待
Executors.newScheduledThreadPool:定长线程池,支持定时和周期性的任务执行
Executors.newSingleThreadExecutor:单线程化的线程池,他会用唯一的一个工作线程来执行任务,保证任务按指定顺序执行
(指定顺序:比如先进先出,优先级等)
六,使用线程池
七,线程池-合理配置
cpu密集型任务,就需要尽量压榨cpu,参考值可以设置为 NCPU+1
IO密集型任务,参考值可以设置为 2*NCPU