在Java中,`Thread` 类的 `start()` 和 `run()` 方法在多线程编程中扮演着至关重要的角色,但它们的作用和行为有很大的不同。下面将简要解释这两个方法之间的区别:
### `start()` 方法
- `start()` 方法用于启动新创建的线程,使之进入就绪状态(ready state),等待被CPU调度执行。
- 当你调用一个线程的 `start()` 方法时,JVM会为这个线程分配必要的资源,并调度其执行。这个过程中,JVM会调用该线程的 `run()` 方法。
- `start()` 方法只能被调用一次。尝试再次调用同一个线程的 `start()` 方法将会抛出 `IllegalThreadStateException`。
- 调用 `start()` 方法后,线程的执行是异步的,即 `start()` 方法会立即返回,而线程的实际执行将在后续某个时间点发生。
### `run()` 方法
- `run()` 方法通常是 `Thread` 类或其子类的实例方法,定义了线程被调度执行时应该完成的任务。
- 在没有通过 `start()` 方法启动线程的情况下,直接调用线程的 `run()` 方法并不会创建新的线程,而是会在当前线程中同步执行 `run()` 方法体内的代码。
- 这意味着,如果直接在主线程中调用一个线程的 `run()` 方法,那么该程序仍然会单线程执行,`run()` 方法中的代码会在调用它的线程(通常是主线程)中顺序执行。
### 示例
public class MyThread extends Thread {
public void run() {
System.out.println("线程运行中...");
}
public static void main(String[] args) {
MyThread t = new MyThread();
// 正确的线程启动方式
t.start(); // 这会创建新线程,并执行t的run()方法
// 如果直接调用run(),则不会创建新线程
// t.run(); // 这将在当前线程(主线程)中同步执行run()方法
}
}
在这个例子中,`t.start()` 会导致 JVM 创建一个新线程来执行 `MyThread` 实例的 `run()` 方法。如果取消注释 `t.run();` 并执行,那么 `run()` 方法将在主线程中同步执行,不会创建新线程。