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
提交
取消