为什么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 的设计体现了面向对象的核心原则:

  • ​组合优于继承​:通过组合方式扩展功能
  • ​单一职责原则​:每个类/接口只做一件事
  • ​开放封闭原则​:对扩展开放,对修改封闭
相关推荐
wen's几秒前
React Native安卓刘海屏适配终极方案:仅需修改 AndroidManifest.xml!
android·xml·react native
编程乐学1 小时前
网络资源模板--基于Android Studio 实现的聊天App
android·android studio·大作业·移动端开发·安卓移动开发·聊天app
没有了遇见3 小时前
Android 通过 SO 库安全存储敏感数据,解决接口劫持问题
android
hsx6663 小时前
使用一个 RecyclerView 构建复杂多类型布局
android
hsx6663 小时前
利用 onMeasure、onLayout、onDraw 创建自定义 View
android
守城小轩3 小时前
Chromium 136 编译指南 - Android 篇:开发工具安装(三)
android·数据库·redis
whysqwhw4 小时前
OkHttp平台抽象机制分析
android
hsx6665 小时前
Android 内存泄漏避坑
android
whysqwhw5 小时前
OkHttp之okhttp-bom模块的分析
android
餐桌上的王子5 小时前
Android 构建可管理生命周期的应用(二)
android