Allen
Lv 7
Allen 發問時間: 電腦與網際網路程式設計 · 8 年前

關於SCJP的題目

這是一題拖曳題:

SCJP 6.0認證教戰手冊 的解答是先「no more output」,再列印字串

而猛虎出閘卻是說先印出字串,最後才是 「no more output」

請問哪本書的解答才是正確的?

http://www.youtube.com/watch?v=KsyROLWDA7o

Youtube thumbnail

&feature=relmfu

已更新項目:

.inturrupt()

這個是在做什麼?

3 個解答

評分
  • 最佳解答

    started

    ran

    interrupting

    ended

    (no more output)

    這是正確的!

    2012-08-13 12:42:38 補充:

    因為程式只是在sleep,

    等sleep完就會印出東西,

    而(no more output)應該是完全不會再印出東西才對

    所以應該放最後

    2012-08-13 21:43:35 補充:

    t.stard(); 開始後 會有兩條執行緒 1.main 2.t的

    如果是main拿到就會印出

    started

    如果t拿到,t的執行緒就睡1秒

    這1秒時間還給main執行緒,

    那main拿到一秒的時間也不會發呆,

    當然繼續往下做,

    但是這時候碰到t.sleep(2000);

    很多人認為這個應該是t執行緒睡覺,

    但是這行實際上是Thread.sleep(2000);

    也就是說叫main執行緒睡覺2秒,

    這時候t執行緒已經sleep完了就印出ran然後執行緒死亡

    main執行緒睡醒後繼續印出

    interrupting

    2012-08-13 21:44:41 補充:

    而t.inturrupt();因為t執行緒已經死亡所以不會印出任何東西

    接著印出

    ended

    會給(no more output)

    是因為題目給了5個空格,

    所以才給這個讓你填!

    2012-08-13 21:59:02 補充:

    € Solid dream builder

    我想是我第一次講的不夠清楚,

    希望這樣能解答你的疑惑!

    參考資料: 自己, 自己, 自己, 自己
  • 恩~離SCJP太久,沒注意題型樣式

    經高手解析,想知道「完整」正確答案,請版主自行撰寫程式碼後

    利用「命令提示字元」,答案便可揭曉~~~

    3年沒碰Java基礎觀念~~~這次也順便複習...|O|

    TO 老納:

    給你一個建議,身為解答者,當然是希望能給予「完全解惑」,畢竟他們不懂才來問,你了解,當然可以簡單一兩句帶過;但恐怕版主可能還是無法了解問題點~

    供你參考。

  • 8 年前

    10Runnable r = new Runnable(){

    11public void run(){

    12try{

    13Thread.sleep(1000);

    14}catch(InterruptedException e){

    15System.out.println("interrupted");

    16}

    17System.out.println("ran");

    18}

    19};

    20Thread t = new Thread(r);

    21t.start();

    22System.out.println("started");

    23t.sleep(2000):

    24System.out.println("interrupting");

    25t.interrupt();

    26System.out.println("ended");

    thread的重點就是,

    thread只處理cpu執行的項目。

    因此除了cpu處理之外的動作,都會讓出程式執行的優先權。

    在程式中如

    System.out.println();==>io

    sleep();==>讓執行緒休息,讓出優先權

    的方法都會使它讓出優先權的動作。

    在21行t.start()後的執行步驟如下

    1.main執行22行 System.out.println("started"); 處理IO,讓出優先權

    2.t執行13行 Thread.sleep(1000);讓出優先權

    3.main執行23行 Thread.sleep(2000);讓出優先權

    ====此時2個thread都在sleep====

    4.t先結束sleep,t執行System.out.println("ran"); 處理IO,讓出優先權,

    5.因main還在sleep,此時t的io已結束,但沒有其他動作,所以t結束程式

    7.main結束sleep(2000)

    剩下的動作執行main 24行後的程式

    如果21行t.start()後後的第1個步驟給t先執行,其結果還是不變

    1.t執行13行 Thread.sleep(1000);讓出優先權

    2.main執行22行 System.out.println("started"); 處理IO,讓出優先權

    ====此時t還在sleep,所以還是由main執行====

    3.main執行23行 Thread.sleep(2000);讓出優先權

    ====此時2個thread都在sleep====

    4.t先結束sleep,t執行System.out.println("ran"); 處理IO,讓出優先權,

    5.因main還在sleep,此時t的io已結束,但沒有其他動作,所以t結束程式

    7.main結束sleep(2000)

    剩下的動作執行main 24行後的程式

    無論那種情況,其結果都是

    started

    ran

    interrupting

    ended

    至於no more output,應該是填多餘格子用的吧.....

還有問題?馬上發問,尋求解答。