一、两种创建方式简述
继承 Thread 子类
自定义类继承 Thread,重写 run (),实例化子类后直接调用 start () 启动线程。
实现 Runnable 接口
自定义类实现 Runnable 并重写 run (),将该类实例传入 Thread 构造方法,再调用 start () 创建线程。
二、核心区别
继承约束
Java 单继承,继承 Thread 后无法再继承其他父类;实现 Runnable 无此限制,可同时继承其他类、实现多个接口,扩展性更强。
资源共享
Thread 子类每个线程是独立对象,难以共享任务数据;Runnable 可多个 Thread 共用同一个 Runnable 实例,天然支持多线程共享资源(如售票、计数场景)。
代码耦合
Thread 子类把线程控制与业务任务写在同一个类,耦合度高;Runnable 将任务逻辑和线程对象解耦,符合单一职责。
线程复用与工程适配
Thread 子类无法适配线程池,每次任务都要新建线程,开销大;Runnable 是线程池、定时任务标准入参,支持线程复用,线上项目主流使用。
使用优缺点
继承 Thread:代码简洁,适合简单测试 Demo;扩展性差、资源共享困难、不适合生产环境。
实现 Runnable:灵活、易共享资源、适配并发工具;代码多一层包装,写法稍繁琐。
三、底层原理补充
Thread 类本身已实现 Runnable 接口;
继承 Thread 并重写 run:执行子类重写的 run;
传入 Runnable 实例:Thread 内置 target 执行外部 Runnable 的 run 逻辑。
四、适用场景
继承 Thread:简单独立小 demo、无继承需求的简易程序;
实现 Runnable:业务开发、多线程共享数据、使用线程池等正式项目。
