大家好,我是锋哥。今天分享关于【java多线程 run() 和 start() 区别?】面试题。希望对大家有帮助;
java多线程 run() 和 start() 区别?
在 Java 中,run()
和 start()
都与线程相关,但它们的作用和使用方式有很大的区别。
1. start()
方法
start()
是 Thread
类的一个方法,用于启动一个新的线程。它的作用是:
- 启动线程:调用
start()
方法会创建一个新的线程,并且会自动调用run()
方法。换句话说,start()
会让线程进入“就绪”状态,准备运行。 - 不能直接调用
run()
:start()
会自动调用run()
方法,因此,调用run()
方法不会创建新的线程,它只是一个普通的方法调用。
调用 start()
方法时,线程会进入一个新的执行路径,也就是新的执行线程会开始执行 run()
方法中的代码。
示例:
public class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread is running!");}public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 启动线程,内部会调用 run()}
}
2. run()
方法
run()
是 Thread
类的一个方法,用于定义线程执行的具体任务。当你重写 run()
方法时,它包含了你希望线程执行的代码。
-
普通方法:如果你直接调用
run()
方法,它不会启动新的线程,而是会像普通方法一样在当前线程中执行。也就是说,run()
方法的调用会在当前线程中执行代码,而不会创建一个新的线程。 -
线程任务:通常,
run()
方法被用来定义线程实际要执行的任务,它通常会在start()
方法内部被调用。
示例:
public class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread is running!");}public static void main(String[] args) {MyThread thread = new MyThread();thread.run(); // 直接调用 run() 方法,在当前线程执行,而不是启动新线程}
}
3. start()
和 run()
的关键区别
特性 | start() | run() |
---|---|---|
作用 | 启动一个新线程并调用 run() 方法。 | 只是定义线程要执行的任务,在当前线程中执行。 |
线程状态 | 会启动一个新的线程,进入就绪状态。 | 不会启动新线程,直接在当前线程中执行。 |
调用时机 | 调用时会触发 Thread 类的内部机制,创建新线程。 | 调用时只是普通方法调用,不会创建新线程。 |
线程执行 | 新线程会并行执行 run() 方法中的代码。 | 当前线程会执行 run() 方法中的代码。 |
总结
start()
方法会启动一个新线程,并自动调用run()
方法。run()
方法定义了线程要执行的任务,但它本身不会创建新的线程。run()
方法只能在新的线程内通过start()
被调用;而如果直接调用run()
,它就只是普通的同步方法,不会启动新线程。
因此,正确的用法是:
- 使用
start()
来启动线程,启动后由系统来调用run()
方法。 - 不要直接调用
run()
,否则它就只是一个普通的同步方法调用。