Thread类大揭秘:线程

从NEW(出生)到TERMINATED(退休),中间全在排队和等待。


 一、Thread的"出生证明"——构造方法

线程出生时必领"身份证"(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会强行关闭守护线程(就像关灯赶保洁阿姨走...)


 三、操控线程的三把金钥匙
1. start()——线程的入职仪式
Thread t = new Thread(() -> System.out.println("努力搬砖!"));  
t.start();  // 这才是真正开工!

⚠️ 警告:调用run()只是普通方法,只有start()能召唤新线程

2. interrupt()——紧急刹车系统

优雅终止线程的两板斧:

// 方法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():只读信号不重置(像消息未读)
3. join()——等我干完活!
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()方法执行完毕

 五、现场直播:用JConsole围观线程状态

实战验证理论!按下面步骤操作:

  1. 运行带死循环的线程:
    new Thread(() -> { while(true); }, "劳模线程").start();
  2. 命令行敲:
    jconsole  # 打开Java监控神器
  3. 连接你的Java进程 → 切到"线程"页签 → 见证奇迹:
    • 运行中的线程 → RUNNABLE
    • 调用sleep()的线程 → TIMED_WAITING
    • 竞争锁失败的 → BLOCKED

实验彩蛋:试试用synchronized制造阻塞线程,在JConsole里看它们卡住的样子~


 灵魂总结
  •  构造线程:先领"身份证"(Thread对象),持"任务卡"(Runnable)上岗
  •  状态流转:理解六个状态切换是调试多线程的必修课
  • ⚔️ 中断艺术:interrupt()不是强制终结,而是礼貌协商
  •  调优神器:JConsole是线程世界的"监控摄像头

你可能感兴趣的:(开发语言,java)