1.4 run()与start()的区别是什么?| Java Debug 笔记

214 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

Debug 笔记 <run()与start()的区别是什么?>

Java的线程是通过Java.lang.Thread类来实现的。JVM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。

start()方法

start()方法是开启了一个线程,会自动调用run()方法,这时无需等待run方法体代码执行完毕,此时程序会可以直接继续自动执行接下来的代码,自动往下执行,此时不等start()方法执行完。

run()方法

如果线程直接调用run()方法,则程序会等run()方法执行完再往下执行。

实际案例

我们用一个例子来看看二者最显著的区别。

调用start()方法

public class demo1 {
    public static void main(String[] args) {
        Runner1 runner1 = new Runner1();
        Runner2 runner2 = new Runner2();
//    Thread(Runnable target) 分配新的 Thread 对象。
        Thread thread1 = new Thread(runner1);
        Thread thread2 = new Thread(runner2);
      thread1.start();
      thread2.start();
//        thread1.run();
//        thread2.run();
    }
}

class Runner1 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("进入Runner1运行状态——————————" + i);
        }
    }
}

class Runner2 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("进入Runner2运行状态==========" + i);
        }
    }
}

输出为:

image.png

调用run()方法

public class demo1 {
    public static void main(String[] args) {
        Runner1 runner1 = new Runner1();
        Runner2 runner2 = new Runner2();
//    Thread(Runnable target) 分配新的 Thread 对象。
        Thread thread1 = new Thread(runner1);
        Thread thread2 = new Thread(runner2);
//    thread1.start();
//    thread2.start();
        thread1.run();
        thread2.run();
    }
}

class Runner1 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("进入Runner1运行状态——————————" + i);
        }
    }
}

class Runner2 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("进入Runner2运行状态==========" + i);
        }
    }
}

输出为:

image.png

通过代码的对比结果,我们可以发现。

只有调用了start()方法,程序才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码,进行操作。