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

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 block
e.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方法?

倚天杖
浏览 73回答 3
3回答

狐的传说

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

子衿沉夜

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

慕丝7291255

线程之间,不要期望操作系统怎么作,这是不靠谱的。这些都应该是程序员自己控制的
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java