在多线程编程中,run()
和 start()
是两种完全不同的方法,它们的核心区别在于 线程的启动和执行方式。以下是它们的异同点总结:
1. 核心区别
方法 | run() | start() |
---|---|---|
作用 | 直接调用普通方法,同步执行 | 启动新线程,异步执行 run() 方法 |
线程行为 | 在当前线程中运行,不会创建新线程 | 创建新线程,由 JVM 调用 run() |
调用次数 | 可多次调用 | 只能调用一次(重复调用会抛 IllegalThreadStateException ) |
2. 代码示例(Java)
class MyThread extends Thread {
@Override
public void run() {
System.out.println("当前线程: " + Thread.currentThread().getName());
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
// 直接调用 run():同步执行(主线程调用)
thread.run(); // 输出: 当前线程: main
// 调用 start():异步执行(新线程调用)
thread.start(); // 输出: 当前线程: Thread-0
}
}
3. 关键异同点
相同点
-
最终都会执行
run()
方法中的代码逻辑。 -
属于同一个线程类(如
Thread
或Runnable
的实现类)。
不同点
特性 | run() | start() |
---|---|---|
线程创建 | ❌ 不创建新线程 | ✅ 创建新线程 |
执行方式 | 同步(阻塞当前线程) | 异步(不阻塞当前线程) |
调用限制 | 可重复调用 | 仅能调用一次 |
底层机制 | 普通方法调用 | 通过 JVM 调用本地方法启动线程 |
4. 为什么需要 start()
?
-
多线程的本质:通过
start()
触发 JVM 创建新的线程,由操作系统调度执行run()
方法,实现并发。 -
直接调用
run()
只是普通方法调用,完全失去了多线程的意义。
5. 注意事项
-
不要重复调用
start()
:
一个线程对象只能调用一次start()
,否则会抛出异常。 -
资源竞争:
start()
启动的线程可能因 CPU 调度顺序导致输出结果不确定(需同步控制)。 -
Runnable 接口:
实现Runnable
时,仍需通过new Thread(runnable).start()
启动线程。
总结
-
用
run()
:当普通方法调用,单线程场景。 -
用
start()
:需要多线程并发时,由 JVM 自动调用run()
。
多线程的核心目的是通过 start()
实现异步执行,而直接调用 run()
仅仅是串行执行代码。