前言
- 在Java中,多线程编程是一个重要的概念,尤其是在处理并发任务时。线程是Java中实现多线程的一种方式。在使用线程时,理解
run()
方法和start()
方法之间的区别是至关重要的。本文将深入探讨如果直接调用线程的run()
方法会发生什么。 - 先说结论:
直接调用 run() 方法不会启动一个新的线程,它只是普通方法调用,代码在当前线程中同步顺序执行。
回顾
- Java 提供了继承
Thread
类、实现Runnable
接口两种方式来实现线程,无论使用哪种方式,都需要重写run()
方法,这是线程执行的入口点。启动一个线程通常使用Thread
对象的start()
方法,该方法会触发线程的启动,并最终调 用run()
方法。
run()
方法 vs start()
方法
run()
方法
run()
方法包含了线程要执行的代码。- 直接调用
run()
方法不会启动一个新线程,它只是在当前线程中执行run()
方法体中的代码。 - 换句话说,直接调用
run()
方法相当于调用一个普通的方法,没有并发行为。
start()
方法
start()
方法会创建一个新的线程,并在新的线程中执行run()
方法。- 调用
start()
方法会使线程从“新建”状态变为“就绪”状态,等待CPU调度。
直接调用 run()
方法的影响
- 为了更好地理解直接调用
run()
方法的影响,考虑以下示例代码:
class MyThread extends Thread {
public void run() {
System.out.println("Thread is running");
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
// 直接调用run()方法
thread.run();
// 调用start()方法
thread.start();
}
}
- 在上述代码中,
thread.run()
和thread.start()
的行为是完全不同的。
直接调用 run()
方法
- 当thread.run()被调用时,输出“Thread is running”。这段代码在主线程中执行,没有启动新的线程。此时,主线程和线程对象的run()方法体是同步顺序执行的。
调用 start()
方法
- 当thread.start()被调用时,输出“Thread is running”。这段代码在一个新线程中执行,与主线程并发运行。主线程和新启动的线程是同时执行的,体现了多线程的并发特性。
示例解析
- 通过以下代码示例可以更清晰地看出区别:
class MyRunnable implements Runnable {
public void run() {
for (int i = 0; i < 5; i ) {
System.out.println("Runnable running " i);
}
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
// 直接调用run()方法
myRunnable.run();
// 调用start()方法
thread.start();
}
}
// 输出
Runnable running 0
Runnable running 1
Runnable running 2
Runnable running 3
Runnable running 4
Runnable running 0
Runnable running 1
Runnable running 2
Runnable running 3
Runnable running 4
- 前五行输出是
myRunnable.run()
直接调用产生的,后五行是thread.start()
启动的新线程产生的。
结论
- 直接调用
run()
方法不会启动一个新的线程,它只是普通方法调用,代码在当前线程中同步顺序执行。而调用start()
方法则会启动一个新的线程,并在该线程中执行run()
方法的代码。
个人简介