一、Java线程生命周期与状态切换

Java学习之==> Java线程生命周期与状态切换

这些状态的描述可以总结成下图:

Java学习之==> Java线程生命周期与状态切换

NEW

一个刚创建但尚未启动的Java线程实例就是处于 NEW 状态

public class App {

  public static void main(String[] args) {

    Thread thread = new Thread();

    Thread.State state = thread.getState();

    System.out.println(state);
  }
}

// 输出结果
NEW

RUNNABLE

当Java线程实例调用了 Thread.start() 方法后,就会进入 RUNNABLE 状态,RUNNABLE状态包含两个子状态:READY 和 RUNNING。

  • READY:该状态的线程可以被线程调度器进行调度使之更变为RUNNING状态。
  • RUNNING:该状态表示线程正在运行,线程对象的run()方法中的代码所对应的的指令正在被CPU执行。

当Java线程实例Thread.yield()方法被调用时或者由于线程调度器的调度,线程实例的状态有可能由RUNNING转变为READY,但是从线程状态Thread.getState()获取到的状态依然是RUNNABLE。例如:

public class App {

  public static void main(String[] args) {

    Thread thread = new Thread(()->{

      Thread.yield();

      System.out.println("testThreadState");
    });

    thread.start();

    Thread.State state = thread.getState();

    System.out.println(state);
  }
}

// 输出结果
RUNNABLE
testThreadState

BLOCKED

阻塞状态,该状态下的线程不会被CPU分配执行时间,线程的状态为 BLOCKED的时候有两种可能的情况:

  • 线程正在等待一个监视器锁,只有获取监视器锁之后才能进入synchronized代码块或者synchronized方法,在此等待获取锁的过程线程都处于阻塞状态。
  • 线程 X 已步入synchronized代码块或者synchronized方法后,调用Object.wait()方法之后进行阻塞(此时已经释放监视器锁),然后线程 T 获取到该监视器锁,此时,如果线程 X 接收到线程 T 调用该锁对象Object#notify()/notifyAll(),但是线程 T 尚未退出它所在的synchronized代码块或者synchronized方法,那么线程 X 依然处于阻塞状态(注意API注释中的reenter,理解它场景2就豁然开朗)。 
public class App {

  public static void main(String[] args) {
    App app = new App();

    Thread thread1 = new Thread(() -> {
      app.produce();
    });

    Thread thread2 = new Thread(() -> {
      app.consumer();
    });

    thread1.start();
    thread2.start();
    System.out.println("thread1:" + thread1.getState());
    System.out.println("thread2:" + thread2.getState());
  }

  public void produce() {
    synchronized (this) {
      try {
        Thread.sleep(5000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

  public void consumer() {
    synchronized (this) {
      System.out.println("testThread");
    }
  }
}

// 输出结果
thread1:RUNNABLE
thread2:BLOCKED
testThread
第一种情况

相关文章:

  • 2021-04-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-12
  • 2022-01-02
猜你喜欢
  • 2021-06-03
  • 2021-07-16
  • 2021-04-30
  • 2021-08-19
  • 2021-07-26
  • 2021-12-18
  • 2022-01-01
相关资源
相似解决方案