线程的 run()和 start()有什么区别?
2 个回答
勇敢一点吧!我们不会比今年更年轻了。澜夜师兄### Thread 类中的 `start()` 和 `run()` 方法的区别 在 Java 中,`Thread` 类用于创建和操作线程。`start()` 和 `run()` 是 `Thread` 类中的两个重要方法,但它们的作用和效果是不同的。 #### `start()` 方法 - **作用**:`start()` 方法用于启动新线程。 - **效果**: - 当调用 `start()` 方法时,Java 虚拟机(JVM)会为这个线程分配资源并调用线程的 `run()` 方法。 - `start()` 方法会新创建一个线程,并在新的线程中执行 `run()` 方法的内容。 - `start()` 方法只能调用一次,多次调用会抛出 `IllegalThreadStateException`。 #### `run()` 方法 - **作用**:`run()` 方法包含线程的执行代码。 - **效果**: - `run()` 方法是一个普通的方法,当直接调用时,它不会创建新线程,而是在当前线程中执行 `run()` 方法的代码。 - `run()` 方法可以直接调用多次,但每次调用都只是在当前线程中执行。 ### 具体区别 - **线程启动**: - `start()` 方法启动一个新线程,并在新线程中执行 `run()` 方法的代码。 - 直接调用 `run()` 方法不会启动新线程,而是在当前线程中执行 `run()` 方法的代码。 - **多次调用**: - `start()` 方法只能调用一次,多次调用会抛出异常。 - `run()` 方法可以直接调用多次,每次都在当前线程中执行。 ### 示例代码 ```java public class MyThread extends Thread { public void run() { System.out.println("Running in thread: " + Thread.currentThread().getName()); } public static void main(String[] args) { MyThread myThread = new MyThread(); // 调用 start() 方法 myThread.start(); // 启动新线程,在新线程中执行 run() 方法 // 调用 run() 方法 myThread.run(); // 在当前线程中执行 run() 方法 // 直接调用 run() 方法,和直接调用方法没有区别 System.out.println("Running in thread: " + Thread.currentThread().getName()); } } ``` ### 输出结果可能是 ```java Running in thread: Thread-0 // 这是 myThread.start() 启动的新线程中的输出 Running in thread: main // 这是 myThread.run() 在主线程中的输出 Running in thread: main // 这是直接调用 run() 方法在主线程中的输出 ``` ### 总结 - `start()` 方法用于启动新线程,并在新线程中调用 `run()` 方法。 - 直接调用 `run()` 方法不会启动新线程,而是在当前线程中执行 `run()` 方法的代码。 理解 `start()` 和 `run()` 方法的区别对于正确使用多线程编程非常重要。确保在需要并发执行代码时使用 `start()` 方法,而不是直接调用 `run()` 方法。发布于 2023-04-15 15:17 •IP属地 天津举报评论收藏
有些东西不需要答案,态度就是答案。路飞每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。 start()方法来启动一个线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码; 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行状态, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。 run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。 如果直接调用run(),其实就相当于是调用了一个普通函数而已,直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用start()方法而不是run()方法。发布于 2021-07-01 19:51 •IP属地 广西举报评论收藏
公众号进入网站体验更佳

