04-线程的生命周期

nobility 发布于 2021-04-30 1258 次阅读


线程的生命周期

Java线程状态

Java中线程共有以下六种状态:

  • New:线程新建状态,创建但还未启动的新线程的状态
  • Runnable:线程可运行状态,包含操作系统中线程两种状态Ready和Running,也就是说无论线程是正在运行还是等待CPU调度都属于该状态
  • Block:线程阻塞状态,Java将线程阻塞状态进一步细分为下面三种状态
    • Blocked:线程被阻塞状态,当线程进入同步代码块或同步方法,并且锁已被占用时线程所处的状态
    • Waiting:线程等待状态,当线程在无限期等待另一个线程的特别动作时的状态
    • Timed Waiting:线程计时等待状态,当线程在有期限等待另一个线程的特别动作时的状态
  • Terminated:线程终止状态,线程执行完毕(包括抛出异常的情况)

Java线程状态转换图

代码中查看Java线程状态

非阻塞状态

public static void main(String[] args) throws InterruptedException {
  Thread thread = new Thread(() -> {
    for (int i = 0; i < Integer.MAX_VALUE; i++) {  //为了让程序运行时间足够长
      if (Thread.currentThread().isInterrupted()) {  //每次循环中检查是否收到中断信号
        System.out.println("收到中断信号,进行保存工作");
        return;  //若收到中断信号该线程的就会执行结束
      }
      if (i == Integer.MAX_VALUE / 2) {
        System.out.println("线程正在运行的状态:" + Thread.currentThread().getState());  //打印出RUNNABLE的状态
      }
    }
  });
  System.out.println("未调用start()方法的状态:" + thread.getState()); //打印出NEW的状态
  thread.start();
  System.out.println("调用start()方法后的状态:" + thread.getState());  //打印出RUNNABLE的状态
  Thread.sleep(5000);  //等待线程结束,可适当调整时间
  System.out.println(thread.getState());  //打印出TERMINATED状态
}

阻塞状态

public class Main {
  private synchronized void sync() {  //当另一个线程也想进入同步方法时会进入Blocked状态
    try {
      Thread.sleep(1000);  //线程休眠会进入TimedWaiting状态
      wait();  //线程等待会进入Waiting状态
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) throws InterruptedException {
    Main main = new Main();  //为了保证多个线程使用的是同一把锁
    Runnable runnable = () -> main.sync();
    Thread thread1 = new Thread(runnable);
    Thread thread2 = new Thread(runnable);
    thread1.start();
    thread2.start();
    Thread.sleep(5);
    System.out.println("先进入同步方法的线程状态:" + thread1.getState());
    System.out.println("后进入同步方法的线程状态:" + thread2.getState());
    Thread.sleep(1500);
    System.out.println("执行wait()方法后的状态:" + thread1.getState());

    thread1.stop();
    thread2.stop();
  }
}
此作者没有提供个人介绍
最后更新于 2021-04-30