线程出生时必领"身份证"(Thread对象),看看几种注册方式:
// 1. 基础款(无名氏线程)
Thread t1 = new Thread();
// 2. 自带任务卡的线程
Thread t2 = new Thread(() -> System.out.println("打工人上线!"));
// 3. 起名狂魔版
Thread t3 = new Thread("线程-9527");
// 4. 豪华全家桶(任务+名字)
Thread t4 = new Thread(() -> {/* 任务 */}, "VIP线程");
命名技巧:给线程起个骚名字(如"订单处理姬"),崩溃日志会感谢你!
每个线程对象自带档案袋:
属性 | 说明 | 生活比喻 |
---|---|---|
getId() |
唯一ID | 身份证号 |
getName() |
名称 | 工牌昵称 |
getState() |
状态(六大人生阶段) | 当前工作状态 |
getPriority() |
优先级(1-10) | VIP等级(未必真管用) |
isDaemon() |
是否是守护线程 | 后台清洁工 |
isAlive() |
是否存活 | 心跳检测 |
isInterrupted() |
是否被中断 | 强制休假通知 |
守护线程冷知识:
当所有普通线程下班后,JVM会强行关闭守护线程(就像关灯赶保洁阿姨走...)
Thread t = new Thread(() -> System.out.println("努力搬砖!"));
t.start(); // 这才是真正开工!
⚠️ 警告:调用
run()
只是普通方法,只有start()能召唤新线程!
优雅终止线程的两板斧:
// 方法1:自定义flag+volatile
volatile bool isQuit = false; new Thread(() -> {
while(!isQuit) { /* 干活 */ } }).start();
// 方法2:内置中断标识
Thread t = new Thread(() -> {
while(!Thread.interrupted()) {
/* 干活 */
}
});
t.start();
t.interrupt(); // 发送中断信号
区别:
Thread.interrupted()
:读完信号会清空状态(像已读不回)isInterrupted()
:只读信号不重置(像消息未读)Thread 财务 = new Thread(做报表);
Thread 老板 = new Thread(等报表);
财务.start(); 财务.join();
// 老板线程卡在这里等
老板.start();
经典场景:主线程需等待子线程完成才能继续(比如下载完再安装)
用地铁系统比喻线程状态:
状态 | 地铁站比喻 | 触发条件 |
---|---|---|
NEW | 买票还未进站 | new Thread() 但未start() |
RUNNABLE | 过闸机准备上车(可能排队) | start()后等待CPU调度 |
BLOCKED | 等特定班次(锁) | 竞争synchronized锁失败 |
WAITING | 无限期等朋友 | 调用wait()/join()无超时 |
TIMED_WAITING | 等朋友但设了闹钟 | sleep(ms)/wait(ms)/join(ms) |
TERMINATED | 到站下车 | run()方法执行完毕 |
实战验证理论!按下面步骤操作:
new Thread(() -> { while(true); }, "劳模线程").start();
jconsole # 打开Java监控神器
实验彩蛋:试试用
synchronized
制造阻塞线程,在JConsole里看它们卡住的样子~