Java 多线程基础:Thread 类详解

在 Java 中,多线程编程离不开 Thread 类。本文将介绍 Thread 的常用属性和方法,并结合实际使用场景进行讲解。


一、线程的创建与基本操作

Java 提供了两种主要方式来创建线程:

继承 Thread

javascript 复制代码
class MyThread extends Thread {
    public void run() {
        System.out.println("这是子线程");
    }
}

MyThread t = new MyThread();
t.start(); // 启动线程,自动调用 run()

实现 Runnable 接口(更常用,推荐)

java 复制代码
Runnable task = () -> System.out.println("这是子线程");
Thread t = new Thread(task);
t.start();

也可以这样写(更简洁)

java 复制代码
Thread t = new Thread(()-> {
    System.out.println("这是子线程");
})

本节聚焦于 Thread 类本身的常用操作。


二、线程的终止:isInterrupted()interrupt()

  • interrupt():用于通知某个线程"你该终止了"。

  • isInterrupted():判断线程是否被中断。

代码示例

java 复制代码
Thread t = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        System.out.println("运行中...");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            System.out.println("被中断啦!");
            break;
        }
    }
    System.out.println("线程退出");
});

t.start();
Thread.sleep(1500);
t.interrupt(); // 请求中断

调用 interrupt() 并不会强制终止线程,线程是否终止还取决于其内部是否响应了中断信号(比如通过轮询 isInterrupted() 或在阻塞方法中抛出 InterruptedException)。

运行结果

java 复制代码
运行中...
运行中...
运行中...
被中断了
线程退出

进程已结束,退出代码为 0

解释说明

1. 运行中...
  • 子线程开始执行,进入 while 循环。

  • 打印"运行中..."后,执行 Thread.sleep(500) 休眠。

2. 运行中...(重复多次)
  • 因为主线程等了 1500 毫秒,所以子线程 sleep(500) 执行了大约 3 次。
3. 被中断了
  • 主线程调用了 t.interrupt(),此时子线程正处于 sleep() 状态。

  • sleep() 收到中断请求会抛出 InterruptedException

  • 异常被 catch,打印"被中断了",并跳出循环。

4. 线程退出
  • 跳出 while 循环后,子线程继续执行最后一行,打印"线程退出"。

示例说明:

线程 A 调用线程 B 的 interrupt() 方法,只是一个请求,线程 B 会不会真的停止,还要看它"愿不愿意"。


三、线程的等待:join()

在线程 A 中调用线程 B 的 join() 方法,会使线程 A 等待线程 B 执行完毕后再继续。

java 复制代码
Thread t = new Thread(() -> {
    System.out.println("线程B开始执行");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("线程B执行完毕");
});

t.start();
t.join(); // 当前线程A将等待t执行完毕

四、获取当前线程实例:currentThread()

方法定义

java 复制代码
@IntrinsicCandidate
public static native Thread currentThread();

该方法是 Thread 类的静态方法,返回当前正在执行的线程对象

使用场景

在任何地方都能调用currentThread(),获得当前线程实例。

比如我在主线程:

java 复制代码
Thread t = Thread.currentThread();
System.out.println("当前线程名: " + t.getName());

输出示例

java 复制代码
当前线程名: main

五、线程休眠:sleep(long millis)

java 复制代码
public static void sleep(long millis)

示例代码

java 复制代码
System.out.println("准备休眠");
Thread.sleep(1000); // 当前线程暂停1秒
System.out.println("休眠结束");

sleep() 方法会使当前线程进入休眠状态,在指定时间内让出 CPU 执行权。

使用场景

  • 控制线程节奏

  • 模拟耗时操作

  • 等待资源准备完成


六、线程的状态(Thread.State)

Java 将线程的运行状态进行了细化,共有六种:

状态名 描述
NEW 创建了线程对象,但还未调用 start()
RUNNABLE 可运行状态(包括正在运行和就绪)
BLOCKED 等待锁(synchronized 块或方法)
WAITING 无限期等待(如 Object.wait()join() 不带超时)
TIMED_WAITING 有时间限制的等待(如 sleep()join(long)
TERMINATED 线程执行完毕或被异常终止

PCB没了,但对象还在,只是无法再做多线程的事情了。

状态图示


七、总结:线程的常用操作

操作 方法/说明
创建线程 继承 Thread 或实现 Runnable
启动线程 start()
终止线程 interrupt(),配合 isInterrupted()
等待线程结束 join()
获取线程实例 Thread.currentThread()
线程休眠 Thread.sleep()
相关推荐
martian6654 分钟前
从Windows开发迁移到信创开发的指南:国产替代背景下的技术路径与实践
开发语言·科技·系统架构·系统安全·创业创新
南玖yy10 分钟前
C++ 成员变量缺省值:引用、const 与自定义类型的初始化规则详解,引用类型和const类型的成员变量自定义类型成员是否可以用缺省值?
c语言·开发语言·c++·后端·架构·c++基础语法
百锦再27 分钟前
Android Studio开发中Application和Activity生命周期详解
android·java·ide·app·gradle·android studio·studio
大G哥30 分钟前
Java 中的 Integer 缓存池:背后的性能优化机制解析
java·开发语言·缓存·性能优化
CN.LG34 分钟前
IntelliJ IDEA 内存优化
java·ide·intellij-idea
笨蛋不要掉眼泪37 分钟前
SpringMVC再复习1
java·spring·mvc
小虚竹1 小时前
claude 3.7,极为均衡的“全能型战士”大模型,国内直接使用
开发语言·后端·claude·claude3.7
苹果酱05671 小时前
python3语言基础语法整理
java·vue.js·spring boot·mysql·课程设计
牛马baby1 小时前
Java高频面试之并发编程-11
java·开发语言·面试
huangyuchi.1 小时前
【C++11】类的新功能
开发语言·笔记·c++11·delete·移动构造·移动赋值·deflut