java中实现runnable接口是创建线程最常用且推荐的方式,它通过分离任务与执行者避免单继承限制,支持复用扩展,并需配合thread类启动;重写run()方法定义逻辑,传入thread构造器后调用start()而非run()。

Java 中实现 Runnable 接口 是创建线程最常用也最推荐的方式,它把“任务”和“执行者”分离,避免单继承限制,也更利于复用和扩展。
核心步骤要记牢
实现 Runnable 并不是直接创建线程,而是定义一个可被线程执行的任务。真正启动线程仍需靠 Thread 类:
- 写一个类,implements Runnable
- 重写
run()方法,放你要并发执行的逻辑 - 用这个类的实例,作为参数传给
Thread构造器 - 调用
thread.start()—— 注意不是run()!
基础写法示例
比如打印 5 次带线程名的日志:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class MyTask implements Runnable {
@Override
public void run() {
for (int i = 0; i
<h3>更简洁:用匿名内部类</h3>
<p>如果任务简单、只用一次,直接写匿名类,省去单独定义类的麻烦:</p>
<pre class="brush:java;toolbar:false;">new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名 Runnable 启动了");
}
}).start();
在 Java 8+ 中还能进一步简化成 Lambda 表达式(因为 Runnable 是函数式接口):
new Thread(() -> {
System.out.println("Lambda 方式启动");
}).start();
注意几个关键细节
- 不能直接调用 run():那样只是普通方法调用,仍在当前线程执行,不会开启新线程
-
run() 方法没有返回值、不抛受检异常:如需返回结果或异常处理,应考虑
Callable+FutureTask - 多个线程可共用同一个 Runnable 实例:适合多线程处理同一类任务(比如多个线程消费队列)
-
线程名可自定义:用
new Thread(runnable, "MyWorker-1")更方便排查日志
为什么比继承 Thread 更优雅
这不是风格偏好,而是设计合理性:
- Java 只允许单继承,如果你的业务类已继承某个父类(比如
Service或Component),就无法再 extendsThread - Runnable 表达的是“我要做什么”,Thread 表达的是“我怎么运行”,职责更清晰
- 线程池(
ExecutorService)只接受Runnable或Callable,不接受Thread子类
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










