java 线程中start方法与run方法的区别详细介绍

  
  1. 什么是线程

Java 中,我们可以通过 java.lang.Thread 类创建线程。线程是一个可以独立运行的子任务。与程序中的其他子任务不同,线程在操作系统层面上是一种独立的执行单元。在单个应用程序内,多个线程可以同时执行,每个线程都有自己的栈和局部变量,线程之间可以共享堆上的变量。由于线程在同时执行,因此在多线程编程中需要引入线程同步、锁和互斥等概念来保证数据的一致性和线程安全。

Java 线程的创建和运行分为两个步骤,分别是:

  • 通过继承 java.lang.Thread 类或实现 java.lang.Runnable 接口的方式创建线程;
  • 调用线程对象的 start() 方法启动线程。

  • start() 方法和 run() 方法的区别

start() 方法和 run() 方法都是线程的启动方法,但是它们的执行效果是不同的。

  • start() 方法用于启动一个新线程,该线程会在新的 JVM 栈中独立运行。start() 方法调用后立刻返回,新线程在 JVM 中独立运行,并且就绪线程池中的其它线程可能会在新线程运行之前执行。

  • run() 方法是线程体的逻辑代码,在 start() 方法被调用后,JVM 会自动调用该方法。run() 方法不会启动一个新的线程,而是在当前线程中执行。因此,如果直接调用 run() 方法,它会在当前线程中执行,不会启动新的线程。

下面是一个例子:

public class ThreadTest implements Runnable {
    @Override
    public void run() {
        System.out.println("Thread started!");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new ThreadTest());
        thread.start(); // 启动新线程
        // thread.run(); // 不会启动新线程,直接在当前线程中执行
    }
}

在上面的例子中,我们创建了一个实现 java.lang.Runnable 接口的类 ThreadTest。在 run() 方法中,我们打印了一条消息。在 main() 方法中,我们创建一个新的线程对象,并传入实例化的 ThreadTest 类。当我们调用 thread.start() 启动线程后,JVM 会自动调用 ThreadTest 类中的 run() 方法,输出 "Thread started!"

如果我们取消注释掉 thread.run(),直接在当前线程中执行,程序只会输出 "Thread started!",并不会启动新的线程。

  1. 总结

在 Java 线程中,start() 方法和 run() 方法是线程的启动方法,但是它们的执行效果是不同的。start() 方法会启动一个新的线程,而 run() 方法不会启动新线程,只会在当前线程中执行。

在实际开发中,我们应该优先使用 start() 方法来启动线程,避免使用 run() 方法直接在当前线程中执行,从而提高程序的并发处理能力。

相关文章