1.Java线程状态
可以分为以下几种状态:
1.新建状态: 刚创建Thread对象。
2.就绪状态: 调用了Thread.start()方法,一切资源已经获取,只等待获取CPU执行。
3.运行状态: 获取CPU执行。
4.死亡状态: 线程已经执行结束生命周期。
5.阻塞状态: 还没获取足够的资源。
阻塞的情况分三种:
- (01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。
- (02) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
- (03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
2.Java线程池状态(盗图)
1.Running: 线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。线程池一被创建,他的状态就是Running.
2.ShutDown: 调用线程池的shutdown()接口时,Running -> shutDown,处于ShutDown状态时,不能接收新任务,但是会处理已经添加的任务。
3.Stop: 调用线程池的shutdownNow()接口时,Running -> stop, 处于stop状态时,不仅不能添加新任务,还会中断正在处理的任务。
4.Tidying: 线程池在shutDown状态下,发现执行的任务为空且阻塞队列为空时,变为Tidying状态.线程池在stop状态下,发现执行的任务为空时,变为Tidying状态.==>当变成这个状态的时候,会执行钩子方法terminated().
5.Terminated: 线程池从Tidying状态执行了钩子方法terminated()后,会进入Terminated.意味着线程池的生命周期走到了尽头。
3.Java线程池参数设置和拒绝策略
参数设置如下:
1.核心线程数:
2.最大线程数:
3. 非核心线程存活时间:
4. 存活时间单位:
5. 阻塞队列:
6. 线程工厂:
7. 拒绝策略:
拒绝策略:
1.AbortPolicy(默认) : 丢弃当前任务并抛出RejectedExecutionException异常。如果是比较关键的业务,推荐使用此拒绝策略,这样子在系统不能承载更大的并发量的时候,能够及时的通过异常发现。需要注意的是一定要处理好抛出的这种异常。
2.DiscardPolicy : 丢弃当前任务。如果你提交的任务无关紧要,你就可以使用它 。因为它就是个空实现,会悄无声息的吞噬你的的任务。所以这个策略基本上不用了。
3.DiscardOldestPolicy : 丢弃队列中最老的任务。是一种喜新厌旧的拒绝策略。是否要采用此种拒绝策略,还得根据实际业务是否允许丢弃老任务来认真衡量。
4.CallerRunsPolicy : 让提交该任务的线程执行任务。一般在不允许失败的、对性能要求不高、并发量较小的场景下使用,因为线程池一般情况下不会关闭,也就是提交的任务一定会被运行,但是由于是调用者线程自己执行的,当多次提交任务时,就会阻塞后续任务执行,性能和效率自然就慢了。
简单介绍下线程提交时候的过程:
1.当核心线程数没满,再创建一个核心线程来处理任务。
2.当核心线程数满了,推到阻塞队列里。
3.当阻塞队列也满了,创建非核心线程。
4.非核心线程数也满了,就只能触发拒绝策略了。