Thread类的基本用法及Java线程的几种状态示例详解

 更新时间:2026年02月08日 10:07:17   作者:xdpcxq1029  
Java线程的状态是一个复杂的概念,它们之间的转换关系也非常重要,这篇文章主要介绍了Thread类的基本用法及Java线程几种状态的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

在Java中,Thread类是多线程编程的核心。

线程创建 (Thread Creation)

  • 创建线程主要有两种逻辑:继承Thread类或实现Runnable接口。
    • 方式1:继承 Thread 类,重写run()
// 自定义线程类继承Thread
class MyThread extends Thread {
    // 重写run(),定义线程执行逻辑
    @Override
    public void run() {
        System.out.println("子线程执行:" + Thread.currentThread().getName());
    }
}

// 使用
public class Demo {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.start(); // 3. 调用start()启动线程(不能直接调用run())
    }
}
  • 方式2:实现Runnable接口,传给Thread
// 实现Runnable接口
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("子线程执行:" + Thread.currentThread().getName());
    }
}

// 使用
public class Demo {
    public static void main(String[] args) {
        // 把Runnable实例传给Thread
        Thread t = new Thread(new MyRunnable());
        t.start(); // 启动线程
    }
}

线程中断 (Thread Interruption)

  • 线程中断不是强制停止线程,而是一种协作机制,即给线程发一个“请停止”的信号。
  • void interrupt():标记线程为 “中断状态”
  • boolean isInterrupted():判断线程是否处于中断状态
  • 若线程在sleep/wait/join时被中断,会抛出InterruptedException,且中断状态会被清除
Thread t = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) { // 检测中断状态
        System.out.println("线程运行中...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // 捕获中断异常后,中断状态会被清除,需手动终止循环
            System.out.println("线程被中断");
            Thread.currentThread().interrupt(); // 重新标记中断(可选)
            break;
        }
    }
});
t.start();
// 主线程1秒后中断子线程
Thread.sleep(1000);
t.interrupt();

线程等待 (Thread Join)

  • 有时主线程需要等待子线程执行完毕后再继续执行,这时可以使用join()。
  • t.join():当前线程会进入阻塞状态,直到线程t执行结束。
  • 带参数的 join(long millis):设置最大等待时间,如果超时线程还没结束,当前线程就不再等待。
Thread t = new Thread(() -> {
    System.out.println("子线程开始执行");
    try { Thread.sleep(2000); } catch (InterruptedException e) {}
    System.out.println("子线程执行完毕");
});
t.start();

// 主线程等待t执行完(最多等3秒)
t.join(3000); 
System.out.println("主线程继续执行");

线程休眠 (Thread Sleep)

  • static void sleep(long millis):让当前线程暂停指定时间(不会释放锁),抛出InterruptedException
System.out.println("开始休眠");
try {
    Thread.sleep(2000); // 当前线程休眠2秒
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println("休眠结束");

获取线程实例 (Get Current Instance)

  • 在编写通用代码(尤其是 Runnable 中)时,常需要知道是谁在运行。
  • Thread.currentThread():返回代码当前正在执行的那个线程对象的引用。
  • 常用操作:获取线程 ID (getId())、获取线程名称 (getName()) 等。
// 获取当前线程(这里是main线程)
Thread mainThread = Thread.currentThread();
System.out.println("当前线程名:" + mainThread.getName()); // 输出"main"

// 子线程实例
Thread t = new Thread(() -> {
    Thread current = Thread.currentThread();
    System.out.println("子线程名:" + current.getName()); // 输出"Thread-0"
});
t.start();

Java线程的几种状态

线程状态一共有几种?

  • Java线程共有6种状态:
    • NEW (新建)
    • RUNNABLE (可运行)
    • BLOCKED (阻塞)
    • WAITING (等待)
    • TIMED_WAITING (超时等待)
    • TERMINATED (终止)

每种状态的含义与切换条件

  • NEW (新建)
  • 含义:创建了线程对象(new Thread()),但尚未调用 start() 方法。
  • 切换:调用 start() 方法后,进入 RUNNABLE 状态。
  • RUNNABLE (可运行)
  • 含义:Java 将操作系统中的“就绪(Ready)”和“运行中(Running)”两种状态统称为 RUNNABLE。处于该状态的线程可能正在 CPU 上执行,也可能正在等待操作系统分配时间片。
  • 切换:
    • 就绪 -> 运行:获得 CPU 时间片。
    • 运行 -> 就绪:CPU 时间片用完,或主动调用 Thread.yield()。
  • BLOCKED (阻塞)
  • 含义:线程正在等待获取一个排他锁(如进入synchronized 代码块/方法),但该锁目前被其他线程持有。
  • 切换:
    • RUNNABLE -> BLOCKED:尝试进入 synchronized 区域失败。
    • BLOCKED -> RUNNABLE:其他线程释放锁,当前线程成功竞争到锁。
  • WAITING (等待)
  • 含义:线程处于无限期的等待状态,不会被分配 CPU 时间,必须等待其他线程显式地唤醒。
  • 切换:
    • RUNNABLE -> WAITING:调用 Object.wait()(不带参数)、Thread.join()(不带参数)或 LockSupport.park()。
    • WAITING -> RUNNABLE:其他线程调用 Object.notify()、notifyAll() 或 LockSupport.unpark()。
  • TIMED_WAITING (超时等待)
  • 含义:与 WAITING 类似,但在指定的时间后会自动唤醒,不需要其他线程显式唤醒。
  • 切换:
    • RUNNABLE -> TIMED_WAITING:调用 Thread.sleep(ms)、Object.wait(ms)、Thread.join(ms) 等带时间参数的方法。
    • TIMED_WAITING -> RUNNABLE:时间结束,或被提前唤醒(如 notify())。
  • TERMINATED (终止)
  • 含义:线程已经执行完毕(run() 方法正常结束)或因异常退出了执行。
  • 切换:线程一旦进入此状态,生命周期结束,不可再次启动(再次调用 start() 会抛出异常)。

总结 

到此这篇关于Thread类基本用法及Java线程几种状态的文章就介绍到这了,更多相关Thread类用法及Java线程状态内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javaSE基础java自定义注解原理分析

    javaSE基础java自定义注解原理分析

    这篇文章主要介绍了javaSE基础对java自定义注解原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多度进步,早日升职加薪
    2021-10-10
  • SpringBoot配置ShedLock分布式定时任务

    SpringBoot配置ShedLock分布式定时任务

    ShedLock是一个在分布式环境中使用的定时任务框架,这篇文章主要介绍了SpringBoot配置ShedLock分布式定时任务,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 基于java下载中getContentLength()一直为-1的一些思路

    基于java下载中getContentLength()一直为-1的一些思路

    下面小编就为大家带来一篇基于java下载中getContentLength()一直为-1的一些思路。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java线程休眠_动力节点Java学院整理

    Java线程休眠_动力节点Java学院整理

    sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。下面通过实例代码给大家介绍Java线程休眠的知识,需要的朋友参考下吧
    2017-05-05
  • 使用EasyExcel实现简单的Excel表格解析操作

    使用EasyExcel实现简单的Excel表格解析操作

    这篇文章主要介绍了如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴趣的可以了解下
    2025-03-03
  • Java从控制台接受输入字符的简单方法

    Java从控制台接受输入字符的简单方法

    这篇文章主要介绍了Java从控制台接受输入字符的简单方法,需要的朋友可以参考下
    2014-02-02
  • swagger中如何给请求添加header

    swagger中如何给请求添加header

    这篇文章主要介绍了swagger中如何给请求添加header,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • spring cloud alibaba Nacos 注册中心搭建过程详解

    spring cloud alibaba Nacos 注册中心搭建过程详解

    这篇文章主要介绍了spring cloud alibaba Nacos 注册中心搭建过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java属性嵌套获取值的实现方式

    Java属性嵌套获取值的实现方式

    本文介绍了如何使用MybatisMetaObject类和FieldUtil工具类来简化Java类嵌套获取属性值的过程,通过这种方式,可以避免逐层检查和判空操作,直接从实例对象中获取深层嵌套的属性值,并且在任意一层为空时自动返回null,不会报错
    2025-11-11
  • Spring Boot项目使用WebClient调用第三方接口的详细教程(附实例代码)

    Spring Boot项目使用WebClient调用第三方接口的详细教程(附实例代码)

    WebClient是Spring WebFlux模块提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具,从Spring5.0开始提供,这篇文章主要介绍了Spring Boot项目使用WebClient调用第三方接口的相关资料,需要的朋友可以参考下
    2025-09-09

最新评论