Java 多线程编程入门:线程创建、生命周期与基本控制

yumo6661周前 (07-27)技术文章9

获课:bcwit.top/14205/

获取ZY↑↑方打开链接↑↑

一、线程创建:三种核心方式及其本质

  1. 继承 Thread 类
  2. 本质:重写 run() 定义任务逻辑,通过 start() 触发线程执行。
  3. 局限:单继承机制限制了扩展性,不符合组合优于继承的原则。
  4. 实现 Runnable 接口
  5. 本质:将任务与线程解耦,任务逻辑写在 run() 中,由 Thread 实例代理执行。
  6. 优势:支持多接口实现,任务可被多个线程共享,规避资源竞争风险。
  7. 实现 Callable + Future 模式
  8. 本质:通过 call() 方法返回结果,支持异常抛出,由线程池或 FutureTask 管理异步执行。
  9. 场景:需要获取线程执行结果或处理执行异常时使用。

核心差异:

Runnable/Callable 是任务定义,Thread 是执行载体;

Callable 是 Runnable 的升级版,支持返回值与异常。


二、线程生命周期:6种状态流转与触发条件


新建 NEW

可运行 RUNNABLE

阻塞 BLOCKED

等待 WAITING

限时等待 TIMED_WAITING

终止 TERMINATED

  1. NEW:new Thread() 后,未调用 start()。
  2. RUNNABLE:调用 start() 后,线程等待CPU调度(包含操作系统层面的 RunningReady 状态)。
  3. BLOCKED
  4. 触发条件:竞争 synchronized 锁失败,进入锁等待队列。
  5. WAITING
  6. 触发条件:调用 object.wait()、thread.join() 或 LockSupport.park()。
  7. 唤醒方式:notify()/notifyAll() 或目标线程终止。
  8. TIMED_WAITING
  9. 触发条件:调用 Thread.sleep(long)、object.wait(timeout) 等带超时参数的方法。
  10. TERMINATED:run() 执行结束或抛出未捕获异常。

关键认知:

RUNNABLE 状态不保证线程正在运行,仅表示“就绪”或“运行中”;

阻塞/等待是 被动行为,由资源竞争或程序逻辑主动触发。


三、线程控制:4大核心手段

1. 线程调度干预

  • Thread.yield():提示调度器让出CPU,但不释放锁,不保证其他线程立即执行。
  • 线程优先级(1~10)
    • 仅作为调度器参考,高优先级不保证优先执行(依赖OS实现)。
    • 滥用可能导致低优先级线程饿死(Starvation)。

2. 线程协作:join()机制

  • 作用:强制调用线程等待目标线程终止(如:主线程等待子线程计算完毕)。
  • 原理:底层通过 wait() 实现,当目标线程结束时触发 notifyAll()。

3. 线程中断:interrupt()

  • 本质:向线程发送中断请求信号(设置中断标志位),非强制终止
  • 响应逻辑
    • 若线程在 wait()/sleep() 中,抛出 InterruptedException 并清除中断标志;
    • 若线程在运行中,需通过 Thread.interrupted() 检测标志并主动终止。
  • 正确用法:任务逻辑中循环检查中断状态,实现优雅退出

4. 守护线程(Daemon Thread)

  • 特性:当所有非守护线程结束时,JVM自动终止所有守护线程(如垃圾回收线程)。
  • 使用场景:执行辅助性任务(监控、心跳检测等),不可用于资源操作(可能被强制中断导致数据不一致)。

四、新手常见误区

  1. 混淆 run() 和 start()
  2. 直接调用 run() 是同步方法执行,不会启动新线程。
  3. 误用线程控制手段
  4. stop()/suspend()/resume() 已废弃,因其会导致资源未释放或死锁。
  5. 忽视线程中断的协作性
  6. 中断请求需被任务逻辑响应,否则无效。
  7. 守护线程的资源风险
  8. 守护线程中执行文件写入或DB操作,可能因JVM退出导致数据丢失。

五、设计思想:多线程的本质价值

  • 核心目标
    • 响应性:避免主线程阻塞(如UI线程);
    • 吞吐量:利用多核CPU并行计算。
  • 平衡原则
    • 线程数并非越多越好(上下文切换开销);
    • 任务拆分粒度影响并行效率(Amdahl定律)。


相关文章

阶段1:编程基础与Java入门(java编程入门资料)

第一部分:基础知识Java的历史和特点Java程序的结构Java开发环境搭建(安装JDK,配置环境变量)数据类型和变量运算符控制流程(if语句,循环语句)数组类和对象封装、继承、多态访问修饰符构造方法...

编程宝典!我的第1本Java编程书《Java从入门到精通》

本书专门为Java初学者和爱好者打造,旨在使读者学会、掌握和能够进行项目开发。当您认真系统学习本书之后,就可以骄傲地说——“我是一位真正的Java程序员了!”,即使目前您还是初学者。【电子版获取方式见...

北京Java编程入门培训怎么选择?寻找您的编程之路的正确指南!

“北京Java编程入门培训怎么选择?”是很多在北京想学习Java朋友的一大疑问,尤其是对于零基础的朋友来说,选择一家靠谱的Java编程入门机构可以快速帮你入门。今天我们就来揭秘这一奥秘!首先,根据自...

Java编程学习难不难 怎样才能快速入门Java

  Java编程学习难不难?怎样才能快速入门Java?对于想要加入IT行业的人来说,Java是一个不错的选择,不仅人才需求大,就业薪资也非常不错。许多人都非常看好Java发展前景,接下来千锋小编就给大...

大数据编程入门:Java网络编程(专业java大数据编程培训)

如果想要编写出一个可以运行在多个设备上的程序,应该怎么做呢?答案是网络编程,今天小编将为大家带来大数据编程入门:Java网络编程。一、网络编程概念网络编程是指编写在通过网络连接的多个设备(计算机)上运...