Java线程分为6种状态:
(1)新建NEW:用new关键字创建的线程就是新建状态,这时候还没有和系统底层真正的线程关联起来,还仅仅只是一个java对象,所以这个时候这个线程不会被系统分配给cpu。
(2)可运行RUNNABLE:当调用了线程的start()后,线程开始运行,这时候就与真正的线程关联起来了,就会分配给它cpu资源。只有可运行状态的线程才会交给cpu执行,其他的都不会。
(3)终结TERMINATED:当线程运行结束之后就是终结状态,系统底层和它关联的线程就会得到释放。
新建到可运行,可运行到终结,这两个过程都是不可逆的。
(4)阻塞BLOCKED:当可运行线程之间争取锁失败后就会变成阻塞状态。持锁线程释放锁之后就会唤醒阻塞的线程,然后开始进行下一轮竞争锁的动作。竞争到锁之后就由阻塞状态变为可运行状态。竞争失败那就继续阻塞状态。
(5)等待WAITING:一个线程获得了锁,但还缺少运行的必要条件时就会调用wait()进入等待状态。但不会长时间占着锁,那就会释放锁给其他线程。那怎样才能由waiting状态转为可运行呢?等满足了缺少的条件后,由另外一个线程调用notify()唤醒该线程;唤醒之后还要重新去争抢锁。抢到就会进入可运行状态。
(6)有时限的等待TIMED_WAITING:有两种情况,①调用带参数的wait方法,指定的时间用完,即使没有线程来唤醒,该线程也会自己醒来。或者其他线程调用notify方法也会醒来。醒来就会去争抢锁,抢到就进入可运行状态。②无论什么时候,当你调用线程的sleep()时,线程会进入等待状态。sleep的时间到了就会恢复为可运行状态。这种等待和锁啊资源条件啊什么没有关系。就是你让线程等,它就必须得等。
处在456这三种状态中,cpu不会执行其代码。