为什么Thread要接受一个Runnable对象

1. 核心设计原理

在 Java/Kotlin 的线程模型中,Thread 类和 Runnable 接口通过 ​​组合模式​​ 实现了职责分离:

  • Thread 类​:负责线程的创建、管理和执行机制
  • Runnable 接口​:定义线程实际要执行的任务逻辑

2. 源代码设计(简化版)

看看 Thread 类的核心源码(简化版):

csharp 复制代码
public class Thread implements Runnable {
    // 关键字段:存储传入的Runnable任务
    private Runnable target;
    
    // 构造函数:接收Runnable对象
    public Thread(Runnable target) {
        this.target = target;
    }
    
    // 线程启动后实际执行的方法
    @Override
    public void run() {
        if (target != null) {
            target.run(); // 调用传入的Runnable对象的run方法
        }
    }
    
    // 启动线程的方法
    public void start() {
        // 底层调用native方法创建新线程
        start0();
    }
    
    private native void start0(); // JVM内部实现
}

3. 执行流程解析

rust 复制代码
sequenceDiagram
    participant A as 主线程
    participant T as Thread对象
    participant R as Runnable对象
    
    A->>T: new Thread(myRunnable)
    A->>T: start()
    T->>JVM: 请求创建新线程
    JVM->>新线程: 创建
    新线程->>T: 调用run()
    T->>R: run()
    R-->>新线程: 执行任务代码

4. 为什么这样设计?

这种设计有三大核心优势:

  1. ​职责分离原则​

    • Thread 专注于线程管理(生命周期、优先级等)
    • Runnable 专注于业务逻辑实现
  2. ​灵活性与复用性​

    scss 复制代码
    // 同一个任务可以被多个线程执行
    val task = MyTask() // 实现Runnable
    
    // 线程1
    Thread(task).start()
    
    // 线程2
    Thread(task).start()
  3. ​避免单继承限制​

    kotlin 复制代码
    // 错误示例:无法同时继承两个类
    class MyThread : Thread(), ActivityListener // 不允许!
    
    // 正确做法:实现Runnable
    class MyTask : Runnable, ActivityListener {
        override fun run() { /*...*/ }
        override fun onActivity() { /*...*/ }
    }

5. 设计模式视角

这是典型的 ​​策略模式(Strategy Pattern)​​:

  • Thread 是上下文(Context)
  • Runnable 是策略接口(Strategy)
  • MyThread 是具体策略实现(ConcreteStrategy)

6. 实际应用示例

kotlin 复制代码
// 创建不同的任务策略
val networkTask = object : Runnable {
    override fun run() { downloadFile() }
}

val dbTask = object : Runnable {
    override fun run() { processDatabase() }
}

// 使用同一个Thread类执行不同策略
Thread(networkTask).start()
Thread(dbTask).start()

7. Kotlin 的简化语法糖

Kotlin 对 Runnable 有特殊支持,可以直接使用 lambda:

scss 复制代码
// 等同于 new Runnable(){ public void run(){...} }
Thread {
    println("在Kotlin中这样更简洁!")
}.start()

总结

Thread 接受 Runnable 的设计体现了面向对象的核心原则:

  • ​组合优于继承​:通过组合方式扩展功能
  • ​单一职责原则​:每个类/接口只做一件事
  • ​开放封闭原则​:对扩展开放,对修改封闭
相关推荐
撩得Android一次心动11 分钟前
Android 项目:画图白板APP开发(一)——曲线优化、颜色、粗细、透明度
android
月夜风雨磊8 小时前
Android NDK从r10c版本到r29版本的下载链接
android·gitee·android ndk
louisgeek9 小时前
Android MIUI 开启 Google Play 服务
android
独行soc9 小时前
2025年大模型安全岗的面试汇总(题目+回答)
android·人工智能·安全·面试·职场和发展·渗透测试
前行的小黑炭10 小时前
Android App:每次想写新项目锻炼一下,但苦于没有UI,那么这篇文章适合你~(适合基础小白锻炼)
android·kotlin
雨白13 小时前
压缩、序列化与哈希
android
安卓开发者13 小时前
RxJava 核心概念解析:构建响应式Android应用的基石
android·echarts·rxjava
叽哥14 小时前
flutter学习第 18 节:设备功能调用
android·flutter·ios
Monkey-旭14 小时前
Android ADB 常用指令全解析
android·adb
来来走走15 小时前
Flutter 顶部导航标签组件Tab + TabBar + TabController
android·flutter