2016-04-06 77 views
1

我有兩個線程同時運行,一個主線程和一箇舊的布爾變量類,我目前有一個thrad打印賠率和其他打印evens,但我讓他們等待彼此以便它按順序打印1 - 100。在java中的類同步

我目前在我的NumberPrinter類中引用了一個布爾對象,並且我正在使用它來使線程進入等待狀態以等待另一個對象。我知道如何在同一個類中進行同步,但是當我嘗試在線程間進行同步時,它會掛起並看起來像布爾變量沒有被更新或與兩個線程同步。至少,這就是爲什麼我認爲是問題

感謝任何建議表示讚賞

我的測試類

public class Test { 

    public static void main(String[] args) throws InterruptedException { 

     NumberPrinter np = new NumberPrinter(); 
     single ent = new single(np);// new state 
     Double ont = new Double(np);// new state 


     ent.start(); 
     ont.start(); 


    } 

} 

類甚至

public class single extends Thread { 

    private NumberPrinter printer; 

    public single(NumberPrinter np) { 
     this.printer = np; 
    } 

    public synchronized void run() { 
     try { 

      for (int i = 1; i <= 100; i++) { 
       System.out.println(printer.isOdd); 
       if (i % 2 == 0) { 
        if (printer.isOdd == true) { 
         wait(); 
        } 
        System.out.println(i); 
        printer.isOdd = true; 
        notifyAll(); 
       } 
      } 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

類奇

public class Double extends Thread { 

    private NumberPrinter printer; 
    public Double(NumberPrinter np) { 
     this.printer = np; 
    } 


    public synchronized void run() { 
     try { 
      for (int i = 1; i <= 100; i++) { 
       System.out.println(printer.isOdd); 
       if (i % 2 == 1) { 
        if (printer.isOdd == false) { 
         wait(); 
        } 
        System.out.println(getName() + ": " + i); 
        printer.isOdd = false; 
        notifyAll(); 
       } 
      } 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

一個類來保存布爾變量

package single; 

public class NumberPrinter { 

    public boolean isOdd = true; 

} 

回答

0

waitnotifyAll需要被調用從兩個線程對同一對象。您還需要同步該對象。你正在使用線程實例,但有兩個不同的實例。你可以使用printer這個對象,或者你可以創建一個new Object()並使用它。 wait也應在while循環中使用,而不是在if語句中使用。

public void run() { 
    try { 
     for (int i = 1; i <= 100; i++) { 
      synchronized(printer) { 
       System.out.println(printer.isOdd); 
       if (i % 2 == 1) { 
        while (printer.isOdd == false) { 
         printer.wait(); 
        } 
        System.out.println(getName() + ": " + i); 
        printer.isOdd = false; 
        printer.notifyAll(); 
       } 
      } 
     } 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
+0

感謝這個修好了!我非常感謝幫助 –