2010-08-27 18 views
2

我想熟悉SCJP的Java線程,我有一個問題。爲什麼java線程wait()只能在這裏使用時間限制?

在下述編寫的代碼我簡單地創建的: 2周的Runnable與 共同的數據存儲(一個陣列)和 同步write()方法用的數據依次留下一個字母作爲標記用於每個可運行以填充它(A和B)。

我知道代碼很粗糙,可以寫得更好,但我正在尋求線程的道德。

所以,現在當我運行它,它永遠不會終止,結果停在:

還是不錯的。 A0。

但是,當我改變等待()等待(100)它工作正常計數從0到9,它正常結束。請問有人能解釋我背後的原因嗎?

謝謝。

public class ArrayThreads { 

Object[] array = new Object[10]; 
boolean isA = true; 

    int position = 0; 

    int getIndex(){ 
     return position; 
    } 



class ThreadA implements Runnable{ 

      synchronized void write(String value){ 
        while(!isA){ 
      try { 
       wait(); 
      } catch (InterruptedException ex) { 
       System.out.println("An error in" + value); 
       ex.printStackTrace(); 
      } 
     } 
     array[position] = value + position; 
     System.out.println(array[position]); 
     position++; 
     isA = !isA; 
     notify(); 
    } 

    public void run() { 
     while(getIndex()<array.length){ 
      if (getIndex()==9) return; 
      else 
     write("A");} 
    } 
} 

    class ThreadB implements Runnable{ 

       synchronized void write(String value){ 
        while(isA){ 
      try { 
       wait(); 
      } catch (InterruptedException ex) { 
       System.out.println("An error in" + value); 
       ex.printStackTrace(); 
      } 
     } 
     array[position] = value + position; 
     System.out.println(array[position]); 
     position++; 
     isA = !isA; 
     notify(); 
    } 

    public void run() { 
     while(getIndex()<array.length){ 
      if (getIndex()==9) return; 
      else 
     write("B");} 
    } 
} 

    public static void main(String[] args){ 
     ArrayThreads threads = new ArrayThreads(); 
     Thread threadA = new Thread(threads.new ThreadA()); 
     Thread threadB = new Thread(threads.new ThreadB()); 
     System.out.println("Still good"); 

     threadB.start(); 
     threadA.start(); 
    } 

}

回答

5

你的線程都在等待並通知獨立的對象 - 所以他們不能互相在所有通信。如果你想讓他們有效地釋放對方,他們需要一個共享監視器來同步,等待並通知。

當你指定一個超時時,它正在「工作」,因爲它有效地將等待呼叫轉換爲睡眠呼叫......仍然沒有什麼是真的在等待/通知有用,因爲兩個線程仍在處理單獨的監視器。

相關問題