为了账号安全,请及时绑定邮箱和手机立即绑定

为什么run方法不能再抢到cpu继续第11次输出日期,而是让main抢到?

为什么run方法不能再抢到cpu继续第11次输出日期,而是让main抢到?

倚天杖 2022-05-17 15:15:54
import java.util.Date;public class IMP {public static void main(String[] a){T t=new T();Thread mt=new Thread(t);mt.start();try {Thread.sleep(10000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}mt.interrupt();}}class T implements Runnable{public void run() {int i=1;while(true){System.out.println(i+" "+new Date());i++;try {Thread.sleep(1000);} catch (InterruptedException e) {return;}}}}在这个例子中,10秒后,main方法的sleep方法结束,按道理这时main和run的线程都在,为什么run方法不能再抢到cpu继续第11次输出日期,而是让main抢到,执行了interrupt方法?
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

看似run方法每次运行需要1秒,实际上光sleep就需要1秒,再加上循环,输出。可能一次运行需要1.01秒。
这样的话,10秒后,run方法仍然在sleep,或许10.1秒的时候才会醒来。
既然run方法在sleep,而mian方法可能在10.01秒时就醒来了,那么就不存在抢的问题了
main方法可能总是先运行。
特别提醒:多线程中各个线程运行时间是不确定的,每次运行可能出现不同结果。
我试验了一下:main方法如果改为sleep 10008ms的话,就会有11次输出了,而改为10007ms的话,可能就只有10次输出。

查看完整回答
反对 回复 2022-05-23
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

main方法是主线程,加上你自己定义的线程,就是说这有2个线程,它们是同等地位的,操作在分配资源的时候是同等对待的,所以你要想达到预期目标,你要在程序中实现好了,不能让操作系统给你分配,不知道我讲的是不是很清楚,希望对你有帮助。

查看完整回答
反对 回复 2022-05-23
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

线程之间,不要期望操作系统怎么作,这是不靠谱的。这些都应该是程序员自己控制的

查看完整回答
反对 回复 2022-05-23
  • 3 回答
  • 0 关注
  • 72 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信