MST

星途 面试题库

面试题:Java中run和start方法在多线程场景下底层区别的体现

在Java多线程编程中,简述`run`方法和`start`方法在底层实现上的主要区别,并举例说明如果错误地调用`run`方法而不是`start`方法,对多线程运行会产生什么影响。
39.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

run方法和start方法在底层实现上的主要区别

  1. start方法
    • start方法是Thread类的一个原生(native)方法,它由JVM底层实现。当调用start方法时,JVM会创建一个新的线程,并在这个新线程中调用run方法。这意味着新线程与主线程(或调用start方法的线程)是并发执行的。
    • start方法只需要调用一次,多次调用会抛出IllegalThreadStateException。例如:
Thread thread = new Thread(() -> System.out.println("Thread running"));
thread.start();
// 再次调用 thread.start(); 会抛出 IllegalThreadStateException
  1. run方法
    • run方法是定义在Runnable接口中的抽象方法,Thread类实现了Runnable接口并实现了run方法。如果一个类继承Thread类,通常会重写run方法来定义线程要执行的任务。
    • run方法本质上就是一个普通的方法调用。当直接调用run方法时,它是在当前线程(即调用run方法的线程)中执行,而不会创建新的线程。

错误调用run方法对多线程运行的影响

如果错误地调用run方法而不是start方法,线程不会并发执行,而是以顺序执行的方式运行。例如:

public class WrongRunCall {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread executing: " + i);
            }
        });
        // 错误调用 run 方法
        thread.run();
        for (int i = 0; i < 5; i++) {
            System.out.println("Main thread executing: " + i);
        }
    }
}

在上述代码中,thread.run()直接调用了run方法,所以thread的任务是在主线程中执行完的,然后才继续执行主线程后续的代码。如果使用thread.start()thread和主线程会并发执行,输出顺序会是不确定的,体现多线程的并发特性。