run()和start()的区别
-
定义
run():这是一个定义线程执行任务的方法。它包含了线程在执行时要运行的代码。start():这是启动线程的方法。它会创建一个新的线程并调用该线程的run()方法。
-
执行方式
-
run():-
如果直接调用
run()方法,线程会在当前线程中执行,而不是在新线程中运行。这样不会创建新的执行路径。 -
例如:
java 复制代码 Thread thread = new Thread(() -> { System.out.println("在当前线程中运行"); }); thread.run(); // 直接调用,在线程中运行
-
-
start():-
调用
start()方法会在新的线程中执行run()方法。它会使线程进入就绪状态,等待操作系统分配CPU资源。 -
例如:
java 复制代码 Thread thread = new Thread(() -> { System.out.println("在新线程中运行"); }); thread.start(); // 启动新线程
-
-
-
线程状态
-
run():- 如果直接调用
run(),线程并不会改变状态,仍然是“新建”状态。
- 如果直接调用
-
start():- 调用
start()后,线程会进入“就绪”状态,并最终转变为“运行”状态。
- 调用
-
-
使用场景
run():通常不直接调用,用于实现线程的逻辑。应通过重写此方法来定义线程行为。start():用于启动线程,应该在创建线程对象后立即调用。
注意事项
- 直接调用
run()方法不会创建新线程,可能会导致代码在当前线程中执行,造成误解。 - 在多线程程序中,务必使用
start()方法来确保并发执行。
示例代码
java
复制代码
public class ThreadExample {
public static void main(String[] args) {
// 创建一个线程
Thread thread = new Thread(() -> {
System.out.println("线程开始运行...");
for (int i = 0; i < 5; i++) {
System.out.println("运行中: " + i);
}
System.out.println("线程结束运行。");
});
// 使用 start() 启动线程
thread.start(); // 线程将在新线程中运行
// 使用 run() 直接调用(不推荐)
thread.run(); // 线程将在当前线程中运行
}
}
运行结果
- 当调用
start()时,线程将在新线程中运行,输出将显示“线程开始运行...”。 - 当调用
run()时,可能会看到输出在主线程中运行,导致可能的逻辑错误或资源竞争。