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


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


    一、start()是什么?

    用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。

    二、run()是什么?

    run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。

    三、具体代码实例

    下面我们来看具体实现,首先是验证调用run()方法并没有真正的启动一个线程

    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            try {
                // 睡眠3秒
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("实现Runnable接口的线程");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    public class MyRunnableTest {
        public static void main(String[] args) throws InterruptedException {
            System.out.println("--------开始调用线程--------");
            Thread thread= new Thread(new MyRunnable());
            thread.run();
            System.out.println("--------调用线程结束--------");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们想要看到,如果run()方法启动了一个线程的话,那么“MyRunnable”中我们设置了休眠,主线程应该继续往下执行,那么输出的结果应该就是:

    --------开始调用线程--------
    --------调用线程结束--------
    实现Runnable接口的线程
    
    • 1
    • 2
    • 3

    但实际运行结果是:

    --------开始调用线程--------
    实现Runnable接口的线程
    --------调用线程结束--------
    
    
    • 1
    • 2
    • 3
    • 4

    接下来我们验证,调用start()方法才算真正的启动了一个线程

    public class MyRunnableTest {
        public static void main(String[] args) throws InterruptedException {
            System.out.println("--------开始调用线程--------");
            Thread thread= new Thread(new MyRunnable());
            thread.start();
            System.out.println("--------调用线程结束--------");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    --------开始调用线程--------
    --------调用线程结束--------
    实现Runnable接口的线程
    
    • 1
    • 2
    • 3

    总结来说就是:
    线程的run()方法是由java虚拟机直接调用的,如果我们没有启动线程(没有调用线程的start()方法,而是在应用代码中直接调用run()方法,那么这个线程的run()方法其实运行在当前线程,(即run()方法的调用方所在的线程)之中,而不是运行在其自身的线程中,从而违背了创建线程的初衷,也就是说并没有创建一个新的线程。

    四、start()和run()方法的区别:

    1、start方法用来启动相应的线程。需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法;

    2、run方法只是thread的一个普通方法,并没有创建新线程,而是运行在当前线程

    3、run方法必须是public的访问权限,返回类型为void。


    参考

    链接: 源码解析
    链接: 线程中start方法和run方法的区别
    链接: run()方法和start()方法的区别

  • 相关阅读:
    postgresql-类型转换函数
    MQ刷盘机制
    MyBatis实验(三)——动态SQL
    大厂真题:【位运算】米哈游2023秋招-相加异或
    ISO20000信息技术服务管理体系认证条件
    TP、FN、FP、TN、准确率、召回率、F1
    Redis中的Zset类型
    Elasticsearch 和 Arduino:一起变得更好!
    Maven之POM文件build标签详解
    云呐|机房监控服务平台,机房监控服务平台有哪些
  • 原文地址:https://blog.csdn.net/starry_night_summer/article/details/127958511