线程的状态类型和相互转换

写博客的目的是为了自己学习和复习,许多解释来自于网上大牛,文章非原创。能帮助到别人当然更好不过,水平有限,可能有许多错误,欢迎指正。

线程状态类型

  1. 新建状态(New):新创建了一个线程对象
  2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权
  3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码
  4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
    (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中
    (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中
    (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态
  5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期
    线程状态图:
    线程的状态类型和相互转换

sleep()和wait()的区别

  1. 这两个方法来自不同的类,分别是:sleep()来自Thread类,wait()来自Object类。sleep()是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉, 要让b线程睡觉要在b的代码中调用sleep。
  2. 锁: 最主要是sleep()方法没有释放锁,而wait()方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep()不出让系统资源;wait()是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait()不会加时间限制,因为如果wait()线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
  3. 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
    synchronized(x){
    x.notify() //或者wait()
    }

链接:https://www.nowcoder.com/questionTerminal/eeff0fdb43034ee7b43838fb9de4519e
来源:牛客网