java创建多线程推荐优先使用runnable接口而非继承thread类,因其避免单继承限制、支持任务共享与线程池集成;必须调用start()启动新线程,直接调用run()仅为普通方法执行。

Java 中创建并启动多线程主要有两种方式:继承 Thread 类或实现 Runnable 接口。推荐优先使用 Runnable,因为它更符合面向对象设计原则(避免单继承限制,支持共享任务逻辑),也更贴近线程池等现代并发实践。
继承 Thread 类的方式
直接继承 Thread 类,重写 run() 方法定义线程执行逻辑,然后调用 start() 启动线程(不是直接调用 run())。
-
必须重写
run():这是线程真正执行的入口; -
调用
start()才会开启新线程,而直接调用run()只是普通方法调用,仍在当前线程执行; - 每个线程实例只能启动一次,重复调用
start()会抛出IllegalThreadStateException。
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程 " + getName() + " 正在运行");
}
}
// 使用
MyThread t = new MyThread();
t.start(); // ✅ 正确:启动新线程
// t.run(); ❌ 错误:只是普通方法调用,不新建线程
实现 Runnable 接口的方式
Runnable 是函数式接口(只有一个 run() 方法),可使用 lambda 简化写法。它本身不表示线程,需传给 Thread 构造器或线程池来执行。
-
解耦任务与执行机制:
Runnable只描述“做什么”,Thread负责“怎么执行”; - 支持多个线程共用同一任务对象,适合处理相同逻辑但不同上下文的场景;
- 配合线程池使用时,必须基于
Runnable(或Callable)。
示例(传统写法):
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Runnable 任务执行中");
}
};
new Thread(task).start();
示例(lambda 写法,更简洁):
Runnable task = () -> System.out.println("Lambda 创建的 Runnable");
new Thread(task).start();
常见误区与注意事项
-
不要混淆
start()和run():只有start()触发 JVM 创建新线程并调度执行run(); -
线程名可自定义:构造
Thread时传入名称,便于调试(如new Thread(runnable, "worker-1")); -
无法获取线程执行结果:
Runnable的run()返回void;如需返回值,应使用Callable<t></t>配合Future; -
线程启动后状态不可控:不能“暂停”“恢复”线程,也不建议调用已废弃的
stop()、suspend()等方法。
何时选哪种方式?
- 仅简单演示或极简场景,可用继承
Thread; - 需要复用任务逻辑、后续可能接入线程池、或类已有父类时,务必选择
Runnable; - 实际项目中,应优先考虑
ExecutorService(如Executors.newFixedThreadPool(3))提交Runnable或Callable,而非手动管理Thread实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










