并发基础之线程的生命周期

Posted chen88

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发基础之线程的生命周期相关的知识,希望对你有一定的参考价值。

线程六种状态详解

在Thread类中有一个枚举类型State定义了线程的六种状态,详细如下,下面来看一下线程的几种状态都是什么:

  • NEW:代表已经创建但是还没启动的新线程
  • RUNNABLE:这是一种特殊的状态,一旦调用start方法就会线程就会运行就会进入RUNNABLE状态。RUNNABLE意思为可运行的,也就是说当我们调用start方法后但是CPU没有分配资源线程等待CPU分配资源这段时间也处于RUNNABLE状态。
  • BLOCKED:当一个线程进入一个被Syncronized修饰的代码块的时候,并且该锁已经被其他线程拿走了,这时候状态是BLOCKED。
  • WAITING:等待。一般是没有设置参数的Object.wait()等方法。
  • TIMED_WAITING:计时等待。一般是带参数的Object.wait()等方法。
  • TERMINATE:一种是线程执行完毕正常结束run方法,还有一种是出现了未捕获的异常导致线程意外终止。

状态转换图示

技术图片

状态转换代码演示

/**
 * @author Chen
 * @Description 演示线程的NEW RUNNABLE TERMINATED状态
 * @create 2019-11-15 22:30
 */
public class NewRunnableTerminated implements Runnable{

    public static void main(String[] args) {
        Thread thread = new Thread(new NewRunnableTerminated());
        //打印NEW状态
        System.out.println(thread.getState());
        thread.start();
        //打印RUNNABLE状态
        System.out.println(thread.getState());
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印RUNNABLE状态,正在运行和等待cpu资源未真正运行时候RUNNABLE
        System.out.println(thread.getState());
    }

    @Override
    public void run() {
        for (int i = 0; i <1000 ; i++) {
            System.out.println(i);
        }
    }
}
/**
 * @author Chen
 * @Description 演示BLOCKED WAITING TIMED_WAITING状态
 * @create 2019-11-15 22:43
 */
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());
        try {
            Thread.sleep(1300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出WAITING状态,因为正在执行
        System.out.println(thread1.getState());
    }


    @Override
    public void run() {
        try {
            syn();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private synchronized  void syn() throws InterruptedException {
        Thread.sleep(1000);
        wait();
    }
}

注意:

  • 线程从NEW到RUNNABLE到TERMINATED是不可逆的,RUNABLE和其他三个状态是可以相互转换的。
  • 状态之间不能跳跃,比如不能从NEW 之间跳到RUNNABLE,只能先运行到RUNNABLE状态才能在进行转换。

阻塞状态说明:一般把Blocked、Waiting、Timed_waiting都成为阻塞状态。因为这几个状态都类似于等待的状态,所以统称为阻塞。

以上是关于并发基础之线程的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Java并发基础Java线程的生命周期

高并发线程的生命周期其实没有我们想象的那么简单!!

Java并发专题之二Java线程基础

Java并发专题之十juc-locks之线程池框架概述

Java并发编程系列之二线程基础

高并发多线程基础之线程池