run()和start()的深入理解

97 阅读2分钟

run()start()的区别

  1. 定义

    • run() :这是一个定义线程执行任务的方法。它包含了线程在执行时要运行的代码。
    • start() :这是启动线程的方法。它会创建一个新的线程并调用该线程的run()方法。
  2. 执行方式

    • run()

      • 如果直接调用run()方法,线程会在当前线程中执行,而不是在新线程中运行。这样不会创建新的执行路径。

      • 例如:

        java
        复制代码
        Thread thread = new Thread(() -> {
            System.out.println("在当前线程中运行");
        });
        thread.run(); // 直接调用,在线程中运行
        
    • start()

      • 调用start()方法会在新的线程中执行run()方法。它会使线程进入就绪状态,等待操作系统分配CPU资源。

      • 例如:

        java
        复制代码
        Thread thread = new Thread(() -> {
            System.out.println("在新线程中运行");
        });
        thread.start(); // 启动新线程
        
  3. 线程状态

    • run()

      • 如果直接调用run(),线程并不会改变状态,仍然是“新建”状态。
    • start()

      • 调用start()后,线程会进入“就绪”状态,并最终转变为“运行”状态。
  4. 使用场景

    • run() :通常不直接调用,用于实现线程的逻辑。应通过重写此方法来定义线程行为。
    • start() :用于启动线程,应该在创建线程对象后立即调用。

注意事项

  • 直接调用run()方法不会创建新线程,可能会导致代码在当前线程中执行,造成误解。
  • 在多线程程序中,务必使用start()方法来确保并发执行。

示例代码

java
复制代码
public class ThreadExample {
    public static void main(String[] args) {
        // 创建一个线程
        Thread thread = new Thread(() -> {
            System.out.println("线程开始运行...");
            for (int i = 0; i < 5; i++) {
                System.out.println("运行中: " + i);
            }
            System.out.println("线程结束运行。");
        });

        // 使用 start() 启动线程
        thread.start(); // 线程将在新线程中运行

        // 使用 run() 直接调用(不推荐)
        thread.run(); // 线程将在当前线程中运行
    }
}

运行结果

  • 当调用start()时,线程将在新线程中运行,输出将显示“线程开始运行...”。
  • 当调用run()时,可能会看到输出在主线程中运行,导致可能的逻辑错误或资源竞争。