Java线程的生命周期,终止与复位

本文详细介绍了Java线程的生命周期,包括新生、运行、阻塞、等待、死亡等状态。强调了不应使用stop方法终止线程,推荐使用interrupt方法,并解释了interrupt方法的工作原理。此外,还探讨了线程的复位,以及在阻塞状态下如何处理中断异常。
摘要由CSDN通过智能技术生成

Thread生命周期

生命周期概述

Java的线程状态描述放在 Thread 类里面的枚举类 State 中.总共包含了6中状态(从出生到死亡)。

public enum State {
    /**
     * 尚未启动的线程的线程状态 (没有start)
     */
    NEW,

    /**
     * 可运行线程的线程状态,是可以运行的线程状态(并不是在运行)
     * 这个状态在Java虚拟机中进行,但它可能等待来自操作系统的其他资源,比如CPU。
     * 内部包含了两个状态 【RUNNING】,【READY】这两个状态是可以互相流转的
     * 调用了start后线程就处于 READY 状态 ,等待操作系统分配CPU时间片,分配后进入 RUNNING 状态。
     * 当调用 yield() 方法后,只是谦让的允许当前线程让出 CPU ,但是不一定让,由操作系统决定,如果让      * 了当前线程就会进入 READY 状态,等待系统分配CPU时间片再次进入 RUNNING 状态。
     */
    RUNNABLE,

    /**
     * 阻塞状态。
     * 线程阻塞,等待监视器锁的状态,获取监视器锁后会进入 RUNNABLE  状态
     * 当发生线程锁竞争状态下,没有获取到锁的线程会被挂起进入阻塞状态,比如synchronized锁。
     */
    BLOCKED,

    /**
     * 等待线程的线程状态
     * 线程调用以下方法会处于等待状态:Object.wait()不超时、Thread.join()不超时等方法
     * 一个处于等待状态的线程正在等待另一个线程执行特定动作,例如:
     * 一个线程调用了Object.wait()方法在一个对象上正在等待另一个线程调用Object.nofify()或者
     * Object.nofifyAll()方法开启那个对象
     * 一个调用了Thread.join()方法的线程正在等待指定线程终止
     */
    WAITING,

    /**
     * 具有指定等待时间的等待线程的线程状态,调用一下方法会处于这个状态: Object.wait() 超时、          * Thread.join()超时 Thread.sleep(long) 等方法 
     */
    TIMED_WAITING,

    /**
     * 已终止线程的线程状态
     * 线程执行完毕或者发生异常终止执行
     */
    TERMINATED;
}

线程生命周期流程图

线程生命周期测试

public class ThreadStatusDemo {
    public static void main(String[] args) throws InterruptedException {
        // 测试 NEW RUNNABLE TERMINATED
        Thread terminated_thread = new Thread(() -> {
            long start = System.currentTimeMillis();
            // 运行三秒 ,打印TERMINATED_THREAD线程runnable状态
            while (System.currentTimeMillis()-start<3000){}
        }, "TERMINATED_THREAD");
        // NEW
        Thread.State state = terminated_thread.getState();
        System.out.println(terminated_thread.getName()+" :state = " + state);

        terminated_thread.start();
        TimeUnit.SECONDS.sleep(1);
        // RUNNABLE
        Thread.State state1 = terminated_thread.getState();
        System.out.println(terminated_thread.getName()+"state1 = " + state1);

        TimeUnit.SECONDS.sleep(5);
        Thread.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值