SCJP 1.6版考題 225

出自 陳富國維基館
於 2013年3月29日 (五) 23:53 由 Ikk (對話 | 貢獻) 所做的修訂 (新頁面: 檔案:SCJP225-1 2.png Given: 8. Runnable r = new Runnable() { 9. public void run() { 10. try { 11. Thread.sleep(1000); 12. } catch(Inte...)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
前往: 導覽搜尋

SCJP225-1 2.png

Given:
8.  Runnable r = new Runnable() {
9.      public void run() {
10.          try {
11.              Thread.sleep(1000);
12.          } catch(InterruptedException e) {
13.              System.out.println(“interrupted”);
14.          }
15.          System.out.println(“ran”);
16.      }
17.  };
18.  
19.  Thread t = new Thread(r);
20.  t.start();
21.  System.out.println(“started”);
22.  try {
23.      t.sleep(2000);
24.  }
25.  catch(Exception e) {}
26.  System.out.println(“interrupting”);
27.  t.interrupt();
28.  System.out.println(“ended”);
Assume that sleep(n) executes in exactly n milliseconds. and all other code executes in an insignificant amount of time. Place the fragments in the output area    to show the result of running this code. 

解答


Ans:
SCJP225-2.png

解說:

題目問設sleep(n)n毫秒內執行完閉,所有其他的程式碼在少量的時間內執行完閉,輸出應該是什麼?

上面的程式完整的寫法如下:

class threadTest{
 public static void main(String[] args){
  Runnable r = new Runnable(){
   public void run(){
    try{
     Thread.sleep(1000);
    }catch(InterruptedException e){
     System.out.println("interrupted");
    }
    System.out.println("ran");
   }
  };
  Thread t = new Thread(r);
  try{
   t.start();
  } catch (Exceotion e){
   System.out.println("started");
  }
  t.sleep(2000);
  System.out.println("interrupting");
  t.interrupt();
  System.out.println("ended");
 }
}

t執行緒被啟動後,執行1秒的睡眠,main執行緒執行2秒的睡眠(t.sleep(2000)),基本上t執行緒會先離開睡眠,而執行印出ran 

之後main離開睡眠狀態,印出interrupting
再發出一個interrupt(因為t已經離開睡眠狀態,這個interrupt不會造成t的睡眠狀態中斷,而印出interrupted。 

main印出ended…


Sleep是Thread的靜態方法不是物件方法,使用方法應為Thread.Sleep(n),第23行行t.sleep(1000)等同於Thread.Sleep(1000)。