面试题答案
一键面试run
方法和start
方法在底层实现上的主要区别
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
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
和主线程会并发执行,输出顺序会是不确定的,体现多线程的并发特性。