java线程状态:new(新建),runnable(就绪),running(运行),blocked(阻塞),dead(死亡)
新建状态(new):Thread被new出来就是新建状态。
就绪状态(runnable):执行Thread.start()方法会使线程进入就绪状态。
运行状态(running):当就绪状态的线程被cpu调度执行的时候就进入运行状态。
阻塞状态(blocked):线程由于某种原因,放弃了对cpu使用的权利,使其暂停执行,知道再次进入就绪状态才会被cpu调度。线程由运行态变成阻塞态的原因有以下三种场景:
- 等待阻塞:调用obj.wait()的时候线程会进入阻塞状态。
- 并发阻塞:比如线程争抢synchronized同步锁没成功的时候会进入阻塞状态。
- 其他阻塞:线程执行过程中调用了Thread.sleep()、Thread.join或者执行了IO操作都会使当前线程进入阻塞状态。
死亡状态(dead):线程执行完毕或者发生异常。线程生命周期结束。
常用线程函数
sleep():当前正在执行的线程暂停执行一段时间。
subThreadxxx.join():当前主线程暂停,等待子线程subThreadxxx执行完主线程再继续执行。
yield():使当前线程由运行状态转为就绪状态。注意如果没有其他线程抢占cpu资源,该线程会接着回到运行状态。
interrupt():不要错以为这个是用来直接中断线程。他是用来向线程发出中断信号,如果线程一直在wait(死锁),则抛出异常,线程dead,当然如果你把这个异常catch了还是不会影响到当前线程。
wait()和notify():obj.wait()和obj.notify()都要在synchronize(obj){}代码段里使用。wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。
wait和sleep区别:sleep不释放锁,wait释放锁。线程被sleep和wait的时候都可以被interrupt打断而抛出异常(注意这个异常是线程抛出的不是interrupt抛出的),虽然不建议这么做。
参考文章:
java线程状态
网友评论