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接口的线程");
    }
}

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("--------调用线程结束--------");
    }
}

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

--------开始调用线程--------
--------调用线程结束--------
实现Runnable接口的线程

但实际运行结果是:

--------开始调用线程--------
实现Runnable接口的线程
--------调用线程结束--------

接下来我们验证,调用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("--------调用线程结束--------");
    }

}
--------开始调用线程--------
--------调用线程结束--------
实现Runnable接口的线程

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

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

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

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

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


参考

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值