JAVA线程的状态

千言万语抵不过一张图...

线程状态转换图

JAVA代码中线程共有6种状态除,RUNNING是为了表示线程正在执行单独增加的一个逻辑状态,实际并没有。

重点关注的四种状态:RUNNABLE、BLOCKED、WAITING和TIME_WAITING,使用jstack打印的线程堆栈中时常会出现以上状态。

  1. BLOCKED: 线程在等待获取锁进入同步块或者同步方法中。两个死锁的线程即是Blocked。
  2. WAITING: 比BLOCKED状态进步一些,指我已经获得锁了,但由于有些条件不满足,我自己等会,调用object.wait()方法。等条件满足了,别的线程调用notify再叫我。另外也可以调用Thread.join()方法,顾名思义就是调用别的线程的join方法,让别人join进来先执行,那我就只能等会了。但是由于wait()和notify()以及notifyAll()用于协调对共享资源的存取,所以必须在synchronized块中使用。所以即便wait状态的线程被notfiy唤醒了,也需要再次获得锁,所以唤醒后进入Blocked状态。
  3. TIMED_WAITING:类比WAITING,差异是不需要notify()或者notifyAlL()方法唤醒,时间到了我自己醒了。另外sleep比较好理解,就是让当前线程睡一会,与wait的区别是它不释放锁。
  4. RUNNABLE: 在JAVA虚拟机中已经在运行,但是在等待操作系统资源,比如CPU时间片。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容