【挑战并发】—– 一文搞清线程的生命周期几个状态

187 阅读1分钟

前言

如果一个知识点,学了10遍还不会!!那就学几十遍,几百遍......如果还学不会,那我不信!!!

线程的生命周期,以及线程的几个状态和状态之间的转化基本上每个人都能说上来,但是每个状态之间的转换,以及调用哪些方法可以由什么样的状态转换到什么样的状态还是有些模糊的。这次盘它!!!

线程的几种状态

比较细致的划分,线程总共有6中状态分别是:

  • New
  • Runnable
  • Blocked
  • Waiting (没有时间期限)
  • Time Waiting (有时间期限)
  • Terminated

线程6钟状态的变化,看图说话,一图胜过千言万语

线程各个状态.png

代码调试

打印 NEW、RUNNABLE、TERMINATED状态

代码

/**
 * @Description:
 * @author: ListenerSun(男, 未婚) 微信:810548252
 * @Date: Created in 2021-04-23 0:55
 */
public class ThreadLifeCycle implements  Runnable{
    public static void main(String[] args) {
        Thread thread = new Thread(new ThreadLifeCycle());
        // 打印出NEW状态
        System.out.println(thread.getState());
        thread.start();
        // 打印出Runnable
        System.out.println(thread.getState());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 打印出 TERMINATED 状态
        System.out.println(thread.getState());
    }
    public void run() {
        for (int i = 0; i < 1000; i++) {

        }
    }
}

打印结果

打印前三种状态.png

打印 Time Waiting、Waiting、BLOCKED状态

因为多线程代码不好调试,可以根据代码中的注释自己开启多线程调试打印出线程的各个状态!!!

/**
 * @Description:
 * @author: ListenerSun(男, 未婚) 微信:810548252
 * @Date: Created in 2021-04-23 1:08
 */
public class ThreadLifeCycle1 implements Runnable {

    public static void main(String[] args) {
        ThreadLifeCycle1 runable = new ThreadLifeCycle1();
        Thread thread1 = new Thread(runable);
        thread1.start();
        Thread thread2 = new Thread(runable);
        thread2.start();
        // 因为thread1正在执行 Thread.sleep(10000),所以打印出TIMED_WAITING状态
        System.out.println(thread1.getState());
        try {
            Thread.sleep(1300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 因为 thread1 正在执行wait()方法所以打印出了 Waiting状态
        System.out.println(thread1.getState());
        // 因为thread2想拿到sync的锁,拿不到所以打印出BLOCKED状态
        System.out.println(thread2.getState());
//        Thread.sleep();
    }
    public void run() {
        sync();
    }
    private synchronized void sync() {
        try {
            Thread.sleep(10000);
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

总结

以上就是线程的各个状态,以及调用哪些方法会触发线程的转换,总结的很全面了!!!

一般而言Blocked、Waiting、Time Waiting这些状态都会被称为阻塞状态,不仅仅是Blocked

你知道的越多,你不知道的越多

如果喜欢请关注我公众号【程序倾听者】,说出你的故事!我在这里倾听!
文章原文地址