手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

Day274.线程的生命周期---6种状态 -Juc

时间:2021/5/21 21:40:34|来源:|点击: 次

线程的生命周期—6个状态

一、线程的状态

1、New

含义已创建,但还未启动的线程

new Thread()一线程后,但还没有执行start()方法

代码演示

image-20210521205449868


2、Runnable

一种特殊的状态,从New状态一旦调用start()方法之后,他就出于Runnable状态;

一旦调用start()方法,线程就会进入Runnable状态

New-------->Runnable

New—XX—>Waiting

表示,可运行状态和正在运行中状态,两种状态;

如果这个线程正在运行,处于Runnable状态,突然被拿走CPU资源,那此时他还是处于Runnable状态

代码演示

image-20210521205701693

image-20210521210132409


3、Blocked

当一个线程被Synchronized修饰的代码块中,且拿不到锁时,他就处于Blocked状态

这个状态只针对Synchronized关键字才会进入Blocked状态

该线程如果处于Blocked状态,那他一定是被Synchronized关键字修饰

唤醒条件是获得到锁,必须等待获取一个锁


4、Waiting

没有时间期限

  • 进入waiting状态

image-20210521204005516

  • 唤醒waiting状态

image-20210521204019714


5、Timed Waiting

类似于上面的waiting状态,区别在于Timed Waiting有时间期限

  • 进入Timed Waiting状态

image-20210521204133295

  • 可提前被唤醒

image-20210521204249301

代码演示

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();
        //线程1拿到锁,但是run()执行1s的睡眠,就处于TimedWaiting状态
        System.out.println(thread1.getState());
        //线程2拿不到锁,就处于于blocked状态
        System.out.println(thread2.getState());
        try {
            Thread.sleep(1300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //线程1拿到锁执行完,下面就执行wait()方法,进入waiting状态
        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-20210521211910673


6、Terminated

终止状态

  • 线程正常完成他的内容
  • 出现一个意外异常,导致run方法意外终止

代码演示

image-20210521210212815


二、线程状态切换图

image-20210521203651798


三、状态转换的特点

  • 一些状态不可逆
  • 状态不能跳跃转换
  • 如果线程已经进入终止状态,还想执行线程,那可重新再创建一个线程进行执行

四、阻塞状态

阻塞状态的定义

一般习惯将,Blocked、Waiting、Timed_waiting状态成为阻塞状态===>《Java并发编程实战5.4小节规定》

阻塞时间不受你控制

五、面试题

线程有几种状态,生命周期是什么?

image-20210521203651798

Copyright © 2002-2019 某某自媒体运营 版权所有