java中thread线程start和run的区别

Java中,线程是程序的执行流,它是在进程中执行的。可以通过继承Thread类或实现Runnable接口来创建线程。在创建线程时,我们需要注意线程的生命周期。在Java中,线程的生命周期可以分为New、Runnable、Blocked、Waiting、Timed Waiting和Terminated这6种状态

Java中,线程是程序的执行流,它是在进程中执行的。可以通过继承Thread类或实现Runnable接口来创建线程。在创建线程时,我们需要注意线程的生命周期。在Java中,线程的生命周期可以分为New、Runnable、Blocked、Waiting、Timed Waiting和Terminated这6种状态。

线程的启动是通过调用start方法来实现的;线程的执行是通过run方法来实现的。那么,start和run方法有什么区别呢?

区别1:start方法和run方法的功能不同

start方法的作用是启动一个新线程,新线程会执行对应Thread对象的run方法,当调用start方法后,该线程会被加入到线程调度器的等待队列中,等待获取CPU时间片,从而运行线程。

run方法的作用是实现线程的执行体,也就是线程要执行的任务或操作。如果直接调用run方法,那么相当于在当前的主线程中执行该方法,不会创建新的线程。

下面是两个示例说明:

// 示例1:使用start方法
public class MyThread extends Thread {

    @Override
    public void run() {
        // 实现线程的执行体
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

// 示例2:直接调用run方法
public class MyThread implements Runnable {

    @Override
    public void run() {
        // 实现线程的执行体
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.run();  // 直接调用run方法,相当于在主线程中执行
        thread2.run();
    }
}

在示例1中,通过使用start方法来启动两个线程,新线程会执行MyThread对象的run方法,输出结果如下:

Thread-0:1
Thread-1:1
Thread-0:2
Thread-1:2
Thread-0:3
Thread-1:3
Thread-0:4
Thread-1:4
Thread-0:5
Thread-1:5

在示例2中,直接调用run方法,相当于在主线程中执行,输出结果如下:

main:1
main:2
main:3
main:4
main:5
main:1
main:2
main:3
main:4
main:5

可以看到,直接调用run方法并没有创建新的线程,而是在主线程中执行了MyThread对象的run方法,因此两个线程的执行结果都是在主线程中输出,没有体现出多线程的优势。

区别2:start方法和run方法执行的时间点

start方法调用后会将线程加入到等待队列中,等待获取CPU时间片运行;而run方法直接在当前线程中执行,不会新建线程。

当调用start方法时,线程被加入到等待队列中,等待获取CPU时间片,同时当前线程继续执行下面的代码。当线程获取到时间片后,才会执行线程的run方法,完成对应的任务。

下面是一个示例:

public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            Thread.sleep(5000);  // 线程睡眠5s
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "执行完成");
    }

    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        thread1.start();
        System.out.println(Thread.currentThread().getName() + "继续执行");
    }
}

在上面的示例中,线程1被启动后,会睡眠5s,然后输出一个执行信息。在启动线程1后,主线程继续执行,输出另一个执行信息。输出结果如下:

main继续执行
Thread-0执行完成

可以看到,当主线程输出“继续执行”时,线程1并没有立即执行对应的任务,而是被加入到了等待队列中,等待获取CPU时间片才开始执行任务。5s后,线程1才输出执行完成的信息。

综上所述,start方法和run方法的区别在于:

  • start方法是启动一个新线程,run方法是实现线程的执行体;
  • start方法会将线程加入到等待队列中,等待获取CPU时间片运行,而run方法直接在当前线程中执行;
  • 调用start方法启动线程时,当前线程继续执行下面的代码;线程获取时间片后执行run方法。

本文标题为:java中thread线程start和run的区别

基础教程推荐