Java中通过实现Runnable接口创建线程,核心是分离任务逻辑与执行主体:run()封装要做的事,Thread负责调度;基本步骤为实现接口、重写run()、传入Thread并start();相比继承Thread,它避免单继承限制、利于测试和线程池复用,符合面向接口设计。

Java 中通过实现 Runnable 接口创建线程,核心是把“要做什么”和“由谁来执行”分开——任务逻辑写在 run() 方法里,线程调度交给 Thread 对象负责。
一、基本实现步骤
只需三步,清晰且低侵入:
- 定义一个类,实现
Runnable接口(必须重写run()方法) - 在
run()方法中编写线程要执行的业务逻辑(比如循环打印、处理数据、调用 API) - 创建该类的实例,再把它传给
Thread构造器,最后调用start()
二、典型代码示例
以下是一个可直接运行的最小完整示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class MyTask implements Runnable {
@Override
public void run() {
for (int i = 0; i System.out.println(Thread.currentThread().getName() + " → 执行第 " + i + " 次");
}
}
}
public class Main {
public static void main(String[] args) {
MyTask task = new MyTask();
Thread t1 = new Thread(task, "工作线程-1");
Thread t2 = new Thread(task, "工作线程-2");
t1.start();
t2.start();
}
}
立即学习“Java免费学习笔记(深入)”;
三、关键注意事项
-
必须调用
start(),不能调用run():直接调run()是普通方法调用,仍在当前线程同步执行,不会开启新线程 -
多个线程可共享同一个
Runnable实例:上面例子中t1和t2共用task,天然适合卖票、计数等共享资源场景(注意加锁或使用原子类保证线程安全) -
支持 Lambda 简写:如果逻辑简单,可跳过单独类,直接写
new Thread(() -> System.out.println("Hello")).start(); -
不破坏类的继承结构:你的任务类仍可继承其他父类(比如
Service或BaseController),因为接口实现不占用extends名额
四、为什么比继承 Thread 更常用
- 避免 Java 单继承限制,保留向上继承能力
- 任务逻辑与线程生命周期解耦,便于单元测试(直接调
task.run()就能验证) - 天然适配线程池:
executor.submit(task)直接复用同一份任务代码 - 符合面向接口编程思想,“任务”是一种行为契约,不是一种线程实体

















