1.Java线程状态

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线程池状态(盗图)

 

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.非核心线程数也满了,就只能触发拒绝策略了。

相关文章: