推荐使用实现runnable接口方式:它规避单继承限制、支持资源共享、任务与线程解耦、适配线程池,符合面向对象设计原则;而继承thread类受限于java单继承,扩展性差且不支持线程池。

在 Java 中,实现 Runnable 接口是创建线程最常用、也最推荐的方式之一。它避免了单继承限制,更符合面向对象设计原则,也便于线程任务与执行机制解耦。
1. 实现 Runnable 接口
你需要定义一个类,重写 run() 方法,把要在线程中执行的逻辑写在里面:
-
run()方法不能有返回值(void),也不能抛出受检异常(如IOException) - 该方法只是定义“任务”,**不会自动启动线程**,必须交给
Thread对象来执行
示例:
class MyTask implements Runnable {
@Override
public void run() {
System.out.println("线程正在运行:" + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
}
}
}
2. 创建 Thread 对象并传入 Runnable 实例
把实现了 Runnable 的对象作为参数传给 Thread 构造器:
- 可以使用匿名内部类或 Lambda 表达式简化写法(Java 8+)
- 建议为线程指定有意义的名称,便于调试和日志追踪
示例(三种写法):
// 方式一:显式类
Runnable task = new MyTask();
Thread t1 = new Thread(task, "MyWorker-1");
// 方式二:匿名内部类
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名线程运行中");
}
}, "Anonymous-Thread");
// 方式三:Lambda(最简洁)
Thread t3 = new Thread(() -> {
System.out.println("Lambda 线程:" + Thread.currentThread().getName());
}, "Lambda-Thread");
3. 启动线程
调用 Thread.start() 方法,JVM 才会真正创建并调度新线程,执行 run() 中的代码:
- ⚠️ 必须调用
start(),不是run()—— 直接调用run()只是在当前线程同步执行,不产生新线程 - 每个
Thread对象只能调用一次start(),重复调用会抛IllegalThreadStateException
启动示例:
t1.start(); t2.start(); t3.start();
4. 补充说明:Runnable vs Thread 子类
为什么优先选 Runnable?
- Java 不支持多继承,如果类已继承其他父类(比如
Frame、Activity),就无法再 extendsThread -
Runnable更体现“任务”本质,线程控制权交由Thread或线程池统一管理,利于资源复用 - 实际开发中,绝大多数场景都通过
ExecutorService提交Runnable,而非手动new Thread().start()
不复杂但容易忽略。关键就三步:写 run()、塞进 Thread、调 start()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











