日誌 - Crux 的日誌
 訂閱 Crux 的日誌

2007/05/13
[Java] Sleep or Wait

作者: Crux (03:43:30)
離職後, 接手我程式的人問我: 「為什麼你的程式都使用 Wait 來暫停, 而不是使用 Sleep ?」. 關於 Java Multi Thread 的控制在 Sleep 和 Wait 間要如何取捨, 的確是一門學問, 大抵上我是從錯誤中學習, 從前 Sleep 用的兇, 現在則儘量少用了.

那到底如何區分? 那就取決於Thread是否是同步使用了, 下面有一隻名為Test的Class, 分別有睡一分鐘及印出test的二個Method, 而Thread1及Thread2則各自呼叫一個, 如此一來會得到什麼樣的結果?
[font=Arial]class Test {
  public 
synchronized void startSleep()  {
    
Thread.sleep(60000);
  }
  public 
void printSomething()  {
      
System.out.println("test");
  }
}

class 
Thread1 extends Thread {
  
Test test;
  public 
T1(Test t)  {
    
test t;
  }
  public 
void run()  {
    
test.startSleep();
  }
}

class 
Thread2 extends Thread {
    
Test test;
    public 
T1(Test t)    {
        
test t;
      }
      public 
void run()      {
        
test.printSomething();
      }
}

public class 
TestSleep {
    public static 
void main(String[] argsthrows Exception    {
      
Test st = new Test();
      new 
Thread1(st).start();
      new 
Thread2(st).start();
    }
}[/
font]

一般來說, 我們以為既是在二個不同的 Thread 中, 理應是 Thread2 先印出test字樣, 而 Thread1 則自己睡自己的. 但是這個例子卻是 Thread1 結束後, Thread2 才會印出test.

原因就是 Sleep, Sleep 會阻塞 Thread, 所以像Test這樣一隻必須提供給多人同時使用的程式, 就不適合使用 Sleep 的方法來實現暫停. 如果把 Sleep 改成Wait, 就達到原本預期的結果了.

所以, 以我接手給別人的程式來說, 它是一個 Message Server, 它不停的在接收各地來的訊息, 並把訊息轉給所需要的人, 就轉送訊息控管的 Class 來說, Server 中有許多對象物件會請它轉送, 但它自己只有一個, 於是當某個對像物件出了什麼況狀需要暫停一下時, 就必需使用Wait, 才不會影響到其他人的轉送.

當然, 如果是不會同步使用, 或是基於效能問題要定期休息一下, 例如
[font=Arial]class Test {
  public static 
void main(String[] argsthrows Exception    {
    While (
true) {
      
System.out.println("test");
      
Thread.sleep(10);
    }
  }
 }
[/
font]

那麼使用 Sleep 或 Wait 就都無所謂囉.
閱讀 Crux 的日誌 | 迴響 (0) | 引用次數 (0) | 瀏覽次數 (3093)
列印這一篇日誌 發送這篇日誌給你的朋友(Email)
網友個人意見,不代表本站立場,對於發言內容,由發表者自負責任。
發表評論
評論規則*
任何人都可以發表評論
標題*
姓名*
信箱*
網站*
內容*
確認碼*
7 - 3 = ?  
輸入運算式的結果
您最多可以嘗試:10 次

日誌月曆

        

會員登入

小老虎成長中

小小龍成長中

搜尋




JUMP to TOP - 10.05.2024 -