如果有遗漏,评论区告诉我进行补充
Thread_start_run__1">面试官: Thread 类中的start()和 run()方法有什么区别 ?
我回答:
在Java中,Thread类是用于创建和管理线程的。了解Thread类中的start()和run()方法之间的区别,对于深入理解Java并发编程至关重要。以下是这两个方法的详细区别和解释:
1. start()
- 定义:
start()
是一个非静态方法,定义在Thread
类中。 - 作用: 启动一个新的线程,并让 JVM 调用该线程的
run()
方法。 - 行为:
- 当调用
start()
方法时,JVM 会为新线程分配必要的资源,并将其加入到系统的线程调度器中。 - 然后,JVM 会在新的线程上下文中执行
run()
方法,而不是在调用start()
的线程中执行。
- 当调用
- 签名:
public void start()
- 注意事项:
- 每个线程只能调用一次
start()
方法。如果尝试再次启动已经启动过的线程,将会抛出IllegalThreadStateException
。
- 每个线程只能调用一次
示例代码
java">public class StartMethodExample extends Thread {
@Override
public void run() {
System.out.println("线程正在运行...");
}
public static void main(String[] args) {
StartMethodExample thread = new StartMethodExample();
thread.start(); // 启动新线程并执行 run() 方法
}
}
2. run()
- 定义:
run()
是一个非静态方法,也定义在Thread
类中,默认实现为空。 - 作用: 包含线程要执行的代码逻辑。
- 行为:
run()
方法中的代码是在新线程中执行的,当start()
方法被调用时,JVM 会自动调用run()
方法。- 如果直接调用
run()
方法(即不通过start()
),它只是作为一个普通的方法调用,在当前线程中执行,不会创建新的线程。
- 签名:
public void run()
- 注意事项:
- 直接调用
run()
不会启动新线程,因此不会并发执行。
- 直接调用
示例代码
java">public class RunMethodExample extends Thread {
@Override
public void run() {
System.out.println("线程正在运行...");
}
public static void main(String[] args) {
RunMethodExample thread = new RunMethodExample();
thread.run(); // 直接调用 run(),没有启动新线程
}
}
主要区别总结
特性 | start() | run() |
---|---|---|
功能 | 启动新线程并让 JVM 调用 run() 方法 | 包含线程要执行的代码逻辑 |
线程创建 | 创建新线程 | 不创建新线程 |
并发执行 | 是 | 否 |
调用方式 | 必须通过 start() 启动新线程 | 可以直接调用,但不会并发执行 |
异常处理 | 无特殊异常 | 无 |
多次调用 | 每个线程只能调用一次 | 可以多次调用,但不会创建多个线程 |
使用场景
start()
: 当你需要真正启动一个新的线程,并希望该线程独立于主线程并发执行时,应该使用start()
方法。run()
: 如果你只需要在一个线程中执行某些代码,并且不需要并发执行,可以直接调用run()
方法,但这通常不是推荐的做法。
总结
理解 start()
和 run()
的区别对于正确地编写多线程程序非常重要。简单来说,start()
用于启动新线程,而 run()
则包含线程的执行逻辑。如果你想要并发执行任务,请务必使用 start()
来启动线程,而不是直接调用 run()
方法。