美文网首页
Java线程系列——线程的生命周期

Java线程系列——线程的生命周期

作者: 禺沫 | 来源:发表于2020-02-24 10:12 被阅读0次

一、6种生命周期介绍

New:已创建未启动的线程。 new Thread,还没执行start方法,这时候它已经做了一些准备工作。
Runnable: 一旦调用了start方法,就到了runnable。不一定拿到系统资源(对应操作系统中的 ready和running)cpu资源又被拿走,也是runnable状态
Blocked: 当线程处在synchronized代码块,该锁已经被其他代码块拿走了(monitor已经被其他线程拿走了)线程的状态就是Blocked。仅仅针对synchronized修饰的。
Waiting:没有设置Timeout参数的Object.wait()方法。
Timed Waiting: 有时间期限的等待,比Waiting多了一个时间参数。
Terminated:已终止。正常运行完,或者出现了一个没有捕获的异常,异常终止。

以下是线程状态间的转化图示:


线程的6个状态.png

下面演示NEW, RUNNABLE,TERMINATED三种状态:

public class NewRunnableTerminated implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 300; i++) {
            System.out.println(i);
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new NewRunnableTerminated());
        System.out.println(thread.getState()); //NEW
        thread.start();
        System.out.println(thread.getState()); //RUNNABLE
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread.getState()); //RUNNABLE

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread.getState()); //TERMINATED
    }
}

下面演示TIMED_WAITING, BLOCKED,WAITING三种状态:

public class BlockedWaitingTimedWaiting implements Runnable {

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

    public static void main(String[] args) {
        BlockedWaitingTimedWaiting runnable = new BlockedWaitingTimedWaiting();
        Thread thread1 = new Thread(runnable);
        thread1.start();
        Thread thread2 = new Thread(runnable);
        thread2.start();
        System.out.println(thread1.getState());//打印出 TIMED_WAITING,因为正在执行Thread.sleep(1000);
        System.out.println(thread2.getState());//打印出BLOCKED状态,因为thread2想拿到sync()的锁却拿不到

        try {
            Thread.sleep(1300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread1.getState());//WAITING
    }

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

运行结果:

TIMED_WAITING
BLOCKED
WAITING

二、阻塞状态是什么?

一般习惯而言,把Blocked(被阻塞)、Waiting(等待)、Timed_waiting(计时等待)都称为阻塞状态。不仅仅是Blocked。概念源自《Java并发实战》

相关文章

  • Java知识梳理六

    一、Java多线程一 1.谈谈线程的生命周期和状态转移 关于线程生命周期的不同状态,在Java 5以后,线程...

  • 深入Java线程(二)

    为了理解可先看深入Java线程(一)内容在看本篇。 线程生命周期 关于线程生命周期的不同状态,在 Java 5 以...

  • java中线程的生命周期

    java中线程的生命周期 线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望...

  • java线程之Thread类

    1. java线程的生命周期 java中的线程的生命周期有6个阶段:- NEW(新建)- RUNNABLE(就绪/...

  • Java多线程模型

    Java多线程模型 生命周期 Java 线程的生命周期包括创建,就绪,运行,阻塞,死亡 5 个状态。一个 Java...

  • 父子进程 父子线程 守护线程

    参考 Java中的父线程与子线程守护线程与守护进程 主线程与子线程生命周期没关系 Son.java Main.ja...

  • 3个月面试20多次Java后端,总结的面试必会知识点

    Java多线程并发 先来看看并发知识库体系图: Java线程实现/创建方式? 4种线程池 ? 线程生命周期(状态)...

  • Java基础学习备忘录(连载之:线程的生命周期)

    疑难困惑备忘录之:线程的生命周期问题。 线程:操作系统能够进行运算调度的最小单位 Java线程的生命周期,即:线程...

  • java多线程--Callable

    **移步[java多线程系列文章]Java多线程(二十二)---LockSupport工具Java 停止线程 一、...

  • JAVA多线程知识体系

    JAVA并发知识库JAVA线程实现/创建方式4种线程池线程生命周期(状态)终止线程4种方式sleep与wait 区...

网友评论

      本文标题:Java线程系列——线程的生命周期

      本文链接:https://www.haomeiwen.com/subject/vokmqhtx.html