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

  • ​组合优于继承​:通过组合方式扩展功能
  • ​单一职责原则​:每个类/接口只做一件事
  • ​开放封闭原则​:对扩展开放,对修改封闭
相关推荐
叶羽西1 分钟前
Android15 EVS HAL中使用Camera HAL Provider接口
android
2501_915918419 分钟前
除了 Perfdog,如何在 Windows 环境中完成 iOS App 的性能测试工作
android·ios·小程序·https·uni-app·iphone·webview
泓博12 分钟前
Android状态栏文字图标设置失效
android·composer
叶羽西1 小时前
Android15系统中(娱乐框架和车机框架)中对摄像头的朝向是怎么定义的
android
Java小白中的菜鸟1 小时前
安卓studio链接夜神模拟器的一些问题
android
莫比乌斯环1 小时前
【Android技能点】深入解析 Android 中 Handler、Looper 和 Message 的关系及全局监听方案
android·消息队列
编程之路从0到12 小时前
React Native新架构之Android端初始化源码分析
android·react native·源码阅读
行稳方能走远2 小时前
Android java 学习笔记2
android·java
编程之路从0到12 小时前
React Native 之Android端 Bolts库
android·前端·react native
爬山算法2 小时前
Hibernate(38)如何在Hibernate中配置乐观锁?
android·java·hibernate