登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
Thread 类的基本用法、Java 线程的几种状态 ...
Thread 类的基本用法、Java 线程的几种状态
[ 复制链接 ]
系味
2026-1-10 01:25:02
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
在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
线程
相关帖子
Kite:Kotlin/Java 通用的全自动 ORM 框架
开发 Java MCP 就像写 Controller 一样简单,还支持 Java 8
双亲表示法构造树-----Java实现
告别繁琐命令行:自研多线程 SSH 极速文件传输助手(附 GitHub 源码)
如何通过Java SDK描述Collection
《软件测试策略》——工具与自动化的基本问题(一)
FastAPI异步多线程:从踩坑到精通,解锁高性能API的正确姿势
Java自学之路1:Hello World
线程如何停止?线程之间如何协作?线程之间的异常如何处理?
Java中的数据类型
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
Kite:Kotlin/Java 通用的全自动 ORM 框架
5
697
仰翡邸
2026-01-22
业界
开发 Java MCP 就像写 Controller 一样简单,还支持 Java 8
5
252
忆雏闲
2026-01-24
安全
双亲表示法构造树-----Java实现
2
410
襁壮鸢
2026-01-25
业界
告别繁琐命令行:自研多线程 SSH 极速文件传输助手(附 GitHub 源码)
2
543
仰翡邸
2026-01-25
科技
如何通过Java SDK描述Collection
1
797
费卿月
2026-01-27
安全
《软件测试策略》——工具与自动化的基本问题(一)
1
532
咳镘袁
2026-01-28
业界
FastAPI异步多线程:从踩坑到精通,解锁高性能API的正确姿势
1
890
呵烘稿
2026-01-28
业界
Java自学之路1:Hello World
1
396
邹弘丽
2026-01-31
业界
线程如何停止?线程之间如何协作?线程之间的异常如何处理?
0
215
辈霖利
2026-02-02
安全
Java中的数据类型
0
813
赖娅闺
2026-02-02
回复
(6)
吟氅
2026-1-14 15:36:46
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢,下载保存了
歇凛尾
2026-1-17 16:01:29
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
过来提前占个楼
方子楠
4 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
这个有用。
眩疝诺
3 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
很好很强大 我过来先占个楼 待编辑
笃扇
昨天 03:17
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
收藏一下 不知道什么时候能用到
痨砖
17 小时前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
谢谢分享,试用一下
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
代码
签约作者
程序园优秀签约作者
发帖
系味
17 小时前
关注
0
粉丝关注
11
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
宋子
9939
6
韶又彤
9952
7
闰咄阅
9993
8
刎唇
9995
9
蓬森莉
9921
10
俞瑛瑶
9998
查看更多
今日好文热榜
530
C++算法算法训练第十二天
910
语言开发随笔2
876
Ivanti EPMM RCE CVE-2026-1340/1281完整分
741
城市智能体:宜昌点军区算力供应链平台的区
248
微软发布Maia200,它也开始与英伟达谷歌掰
921
微软发布Maia200,它也开始与英伟达谷歌掰
470
选型指南】医用控温仪显示屏如何兼顾IEC606
457
IDEA 终于也能爽用 Claude Code 了!!
855
GIM 2.0 发布:真正让 AI 提交消息可定制、
172
C# 设置 Word 文档背景颜色/背景图
842
妙手ERP荣膺TikTok Shop 2025 H1“优质招商
159
题解:P15049 [UOI 2022 II Stage] 图 2
975
vue 甘特图 vxe-gantt 自定义任务条插槽模
239
Qt 技巧笔记(四)QVector 的底层原理与高
713
零门槛搭建部署 OpenClaw/Moltbot/Clawdbot
762
如何保障分布式IM聊天系统的消息可靠性(即
985
【面试题】MySQL 中 count(*)、count(1) 和
546
MWGA让千亿行代码在Web端“复活”!
29
spring6-多种类型的注入方式
661
LLVM Pass快速入门(二):运行第一个pass