登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
Thread 类的基本用法、Java 线程的几种状态 ...
Thread 类的基本用法、Java 线程的几种状态
[ 复制链接 ]
系味
14 小时前
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
在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
线程
相关帖子
JAVA 使用国密 SM4 加解密
Java单元测试、集成测试,区别
Java 哪些情况会导致内存泄漏
多线程项目中实战
字典树的一百种用法
Java 部署脚本,支持回滚
解决java客户端连接ssh失败问题
PHP 异步与多线程 从 TrueAsync 展望未来
shiro--身份授权的基本流程
Java中String类(StringBuffer、StringBuilder)相关
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
JAVA 使用国密 SM4 加解密
2
154
骆熙华
2025-12-22
业界
Java单元测试、集成测试,区别
1
478
距佰溘
2025-12-24
业界
Java 哪些情况会导致内存泄漏
0
411
寥唏
2025-12-29
安全
多线程项目中实战
0
752
任娅翠
2026-01-02
业界
字典树的一百种用法
0
520
焦和玉
2026-01-04
业界
Java 部署脚本,支持回滚
1
172
阎一禾
2026-01-04
业界
解决java客户端连接ssh失败问题
1
958
师悠逸
2026-01-06
业界
PHP 异步与多线程 从 TrueAsync 展望未来
1
224
旌磅箱
2026-01-07
安全
shiro--身份授权的基本流程
0
86
押疙
2026-01-07
业界
Java中String类(StringBuffer、StringBuilder)相关
0
743
洪思思
2026-01-08
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
系味
14 小时前
关注
0
粉丝关注
11
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994891
kk14977
6845358
4
xiangqian
638210
5
韶又彤
9992
6
宋子
9978
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9946
查看更多
今日好文热榜
428
淮南市英语雅思培训辅导机构推荐;2026权威
544
【节点】[Channel-Flip节点]原理解析与实际
318
FFmpeg开发笔记(九十七)国产的开源视频剪
420
AI Agent 的记忆系统:从必要性到工程实践
638
AI一周资讯 260105-260109
547
以专业立口碑 以诚信铸品牌 专访北京丰宝斋
615
《ESP32-S3使用指南—IDF版 V1.6》第六十一
269
棒棒糖图:当条形图遇上极简美学
221
基于python mne库构造自定义fNIRS数据并可
242
TMS FNC Core和 Maps的Edge WebView2安装问
887
15分钟开发一个周报生成mcp,再也不用为写
942
搭建你的个人图床
196
obet快速修改scn/resetlogs恢复数据库(缺少
248
Thread 类的基本用法、Java 线程的几种状态
995
MQTT状态管理Vuex全局状态管理
129
初识Tauri
926
源码独立部署成企业数据安全新选择 广州旗
145
一款基于 .NET 9 构建的企业级 Web RBAC 快
363
2026.1.9日闲话:DAG 计数
437
Git使用经验总结9-Git提交关联到Issue