【Kill Thread Part.1-4】图解线程生命周期

【Kill Thread Part.1-4】图解线程生命周期

一、线程的六个状态

image-20220120144850901

1、New

  • 已经创建,但是还没有启动的状态。
  • 通过new Thread()创建线程猴的状态。

2、Runnable

  • 从New状态调用start()方法之后,就会处于Runnable状态了。
  • 可运行状态
    • 有可能正在执行,也有可能没有执行
    • 比如说一个线程正在CPU执行任务处于运行的状态,突然CPU分配给其它线程了,那么这个线程还是处于Runnable状态。
    • 如果再次被分配CPU资源,这个线程就可以继续运行了。

3、Blocked

  • 进入synchronized代码块,进入Blocked状态,其他线程获得了互斥对象的moniter锁。
    • 而本线程并没有拿到锁,就会进入这个状态。

4、Waiting

  • 调用wait(),join()方法进入Waiting状态。

5、Timed Waiting

  • 计时等待方法,会让线程进入Timed Waiting方法。

6、Terminated

二、实际代码演示状态

1、New、Runnable、Terminated

即使在运行的时候,线程的状态也是Runnable,而不是Running

①测试代码
/**
 * 描述: 展示线程的NEW、RUNNABLE、Terminated状态
 * 即使是正在运行,也是Runnable状态,而不是Running状态
 */
public class NewRunnableTerminated implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            System.out.println(i);
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new NewRunnableTerminated());
        //打印出new的状态
        System.out.println(thread.getState());
        thread.start();
        System.out.println(thread.getState());
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出Runnable的状态,即使是正在运行也是Runnable,而不是Running
        System.out.println(thread.getState());
    }
}
②运行结果

image-20220120145848849

在运行完之后就会打印出Terminated状态。

2、Blocked、Waiting、Timed_Waiting状态

①测试代码

/**
 * 描述:     展示Blocked, Waiting, TimedWaiting
 */
public class BlockedWaitingTimedWaiting implements Runnable{
    public static void main(String[] args) {
        BlockedWaitingTimedWaiting runnable = new BlockedWaitingTimedWaiting();
        Thread thread1 = new Thread(runnable);
        thread1.start();
        Thread thread2 = new Thread(runnable);
        thread2.start();
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出Timed_Waiting状态,因为正在执行Thread.sleep(1000);
        System.out.println(thread1.getState());
        //打印出BLOCKED状态,因为thread2想拿得到sync()的锁却拿不到
        System.out.println(thread2.getState());
        //等待wiait代码的执行
        try {
            Thread.sleep(1300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出WAITING状态,因为执行了wait()
        System.out.println(thread1.getState());

    }

    @Override
    public void run() {
        syn();
    }

    private synchronized void syn() {
        try {
            Thread.sleep(1000);
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

②运行结果

image-20220120150844499

三、状态转换的注意点

  • 可以从New -> Runnable -> Terminated,但是不是双向的。

  • 双向转换的时Runnable和Blocked,Runnable和Waiting,Runnable和Timed_Waiting

  • 并且状态不能够跳跃

四、阻塞状态

  • 一般习惯而言,把Blocked(被阻塞)、Waiting(等待)、Timed_Waiting(计时等待)都称之为阻塞状态。
  • 不仅仅是Blocked
  • 进入阻塞状态的原因:
    • 等待synchronized锁 Blocked
    • 或者是运行了wait()方法
    • IO操作
    • Sleep()计时等待操作

五、常见面试问题

线程有哪几种状态?线程的声明周期是什么样的?

posted @ 2022-01-20 15:18  DarkerG  阅读(51)  评论(0编辑  收藏  举报