runnable是函数式接口,thread是实现runnable的类;继承thread受限于单继承,实现runnable更灵活;必须调用start()而非run()才能真正并发;推荐runnable配合executorservice使用。
Runnable 是接口,Thread 是类
Java 中 Runnable 是一个函数式接口,只定义了 run() 方法;而 Thread 是一个具体类,它实现了 Runnable 接口,并封装了线程的生命周期管理逻辑。这意味着你不能直接“继承多个类”,但可以实现多个接口——所以当你的类 already extends 某个父类时,只能选择实现 Runnable,无法再 extends Thread。
常见错误现象:class MyTask extends Thread implements Runnable —— 多余且误导,Thread 本身已实现 Runnable,无需重复声明。
- 使用场景:需要复用任务逻辑(比如同一
Runnable实例被多个Thread执行)时,必须用Runnable - 参数差异:传给
Thread构造器的Runnable对象是任务体;而继承Thread后重写的run()就是任务体本身 - 性能影响:无本质差异,但
Runnable更轻量——它不携带线程资源,只描述行为
start() 和 run() 的调用效果完全不同
无论你用哪种方式创建线程,都必须调用 start() 才会真正启动新线程并执行 run() 方法;如果直接调用 run(),只是在当前线程同步执行,不会开启新线程。
典型错误:new Thread(new MyTask()).run(); —— 看似像多线程,实则仍是单线程串行执行,毫无并发意义。
立即学习“Java免费学习笔记(深入)”;