前言
我们最开始学习线程的时候通常是通过new Thread()的方式去创建一个线程
但是这种方式去创建一个线程会有好多的弊端
- 每次开启线程的时候使用new Thread新建,性能比较差
- 通过new Thread创建的线程缺乏统一的管理,可能无限制的新建线程,线程间相互竞争,有可能占用过多的系统资源导致死机或者OOM
Thread这个类缺少更多的功能,比如更多的执行、定期执行、线程中断等
线程池的好处
可以重用存在的线程,减少对象的创建、消亡的开销,性能或提升很多
- 可以有效的控制最大并发线程数,提高系统资源利用率,同时还可以避免过多的资源竞争,避免阻塞
线程池可以提供定时执行、定期执行、单线程、并发控制等比较高级的功能
线程池相关的类
ThreadPoolExecutor
主要参数 :
- corePoolSize: 核心线程数量
- maximumPoolSize: 线程最大线程数
- workQueue: 阻塞队列,存储等待执行的任务,很重要,会对线程池运行过程产生比较大的影响
- keepAliveTime: 线程池维护线程所允许的空闲时间(没有任务执行时候最多保持多久时间终止)
- unit: keepAliveTime的时间单位
- threadFactory: 线程工厂,用来创建线程
注意 :如果使用默认的线程工厂 来创建线程的话,会让新创建的线程具有相同的优先级,并且是非守护的线程,同时也设置了线程的名称
- rejectHandler:拒绝处理任务的策略
注意 :线程池提供了四种拒绝策略,默认策略是直接抛出异常,第二种是用调用者所在的线程来执行任务,第三种是丢弃队列中最靠前的任务,并执行当前的任务,第四种策略是直接丢弃这种任务。
线程池示例的几种状态
当我们创建一个线程池以后通常会有几种状态:running,shutdown,stop,tidying,terminated
- running状态:能够接受新提交的任务,并且也能处理阻塞队列里面的任务
- shutdown: 这是关闭的状态,当一个线程池实例出于关闭状态的时候,不能再接受新提交的任务,但是可以处理阻塞队列里面已经保存的任务
stop状态:当实例出于stop状态的时候,既不能接受新的任务任务,也不可以处理队列中的任务,stop状态会中断正在处理任务的线程,
线程池的相关方法
execute(): 提交任务,交给线程池执行
- submit():提交任务,能够返回执行的结果,相当于execute+future这两个方法的效果
- shutdown():关闭线程池,等待任务都执行完
- shutdownNow():关闭线程池,不要等待任务执行完
- getTaskCount(): 线程池已执行和未执行的任务总数
- getCompletedTaskCount():已完成的任务数量
- getActiveCount():当前线程池中正在执行任务的线程数量
