[Java 并发]再谈为什么启动线程时使用 start ,而不是 run

其实这个主题,原来我写过: [Java 并发]为什么启动线程时使用 start 而不是 run ?
在上篇文章中,主要是通过例子,向大家展示了如果调用 run 方法,线程并不是运行在自己的线程中,而是运行在了当前线程中
也就是,如果调用 run 方法的话,它本来应该是在 A 线程中运行的,但是因为直接调用了 run 方法,它可能就执行在了 main 线程中
我们本来是希望这些线程异步执行的,结果直接调用了 run 方法就成了同步执行

所以为什么直接调用 run 方法就成了同步,而如果使用 start 方法,则成了异步
原因就是因为它们告诉 CPU 不同的内容

当调用 start 方法时,只是告诉了"线程规划器"说这个线程已经准备就绪了,就差调用线程对象的 run 方法了,此时系统就会安排一个时间来调用这个线程的 run 方法,进而线程得到运行,启动线程,达到了异步执行的效果

而如果调用 run 方法,那就不是异步执行了,因为调用 run 方法,就相当于现在就要启动运行,此时的线程对象并没有交给"线程规划器"来进行处理,而是直接由 main 线程接管了,来调用 run 方法让线程得到运行,启动线程
但是此时的 main 线程有可能正在运行其他的线程,根本没有空余时间来运行此次调用的 run 方法,结果呢,就是要等到 main 线程中的代码执行完毕,才会来执行 run 方法
这不就是同步执行了嘛

所以,调用 start 方法,真正达到了异步执行的效果
而调用 run 方法,还是在同步执行代码,并没有充分利用多线程的优势

以上
我觉得我这次理解到位了
你呢?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值