Java 多线程基础:Thread 类详解
在 Java 中,多线程编程离不开
Thread
类。本文将介绍Thread
的常用属性和方法,并结合实际使用场景进行讲解。
一、线程的创建与基本操作
Java 提供了两种主要方式来创建线程:
-
继承
Thread
类class MyThread extends Thread {public void run() {System.out.println("这是子线程");} }MyThread t = new MyThread(); t.start(); // 启动线程,自动调用 run()
-
实现
Runnable
接口(更常用,推荐)Runnable task = () -> System.out.println("这是子线程"); Thread t = new Thread(task); t.start();
也可以这样写(更简洁)
Thread t = new Thread(()-> {System.out.println("这是子线程"); })
本节聚焦于 Thread
类本身的常用操作。
二、线程的终止:isInterrupted()
与 interrupt()
-
interrupt()
:用于通知某个线程“你该终止了”。 -
isInterrupted()
:判断线程是否被中断。
代码示例
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
)。
运行结果
运行中...
运行中...
运行中...
被中断了
线程退出进程已结束,退出代码为 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 执行完毕后再继续。
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()
方法定义
@IntrinsicCandidate
public static native Thread currentThread();
该方法是
Thread
类的静态方法,返回当前正在执行的线程对象。
使用场景
在任何地方都能调用currentThread(),获得当前线程实例。
比如我在主线程:
Thread t = Thread.currentThread();
System.out.println("当前线程名: " + t.getName());
输出示例
当前线程名: main
五、线程休眠:sleep(long millis)
public static void sleep(long millis)
示例代码
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() |