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次输出。
子衿沉夜
TA贡献1828条经验 获得超3个赞
main方法是主线程,加上你自己定义的线程,就是说这有2个线程,它们是同等地位的,操作在分配资源的时候是同等对待的,所以你要想达到预期目标,你要在程序中实现好了,不能让操作系统给你分配,不知道我讲的是不是很清楚,希望对你有帮助。
添加回答
举报
0/150
提交
取消