2013-04-06 79 views
1

我無法找到解決此問題的方法。我在某個時候搞亂了,但不確定。請給你的建議來克服這一點。線程同步。正確打印數值

問題:

具有三個陣列,每一個陣列被分配給線程,輸出應在序列...

T1 = {1,4,7} T2 = {2,5, 8} T3 = {3,6,9}

預期輸出

出來= {1,2,3,4,5,6,7,8,9}

WHT我試圖:

public class Worker extends Thread { 
    Worker next; 
    int[] val; 
    Object lock = new Object(); 

    Worker(int[] val) { 

     this.val = val; 
    } 

    public void setnext(Worker next) { 
     this.next = next; 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i < val.length; i++) { 
      synchronized (this) { 
       synchronized (next) { 

        System.out.println(val[i]); 
        next.notify(); 

       } 

       synchronized (this) { 
        try { 

         this.wait(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
      synchronized(next){ 
       next.notify(); 
      } 
     } 
    } 
} 

和測試類

public class TestWorker { 
    public static void main(String[] args) throws Exception{ 
     Worker worker1 = new Worker(new int[]{1,4,7}); 
     Worker worker2 = new Worker(new int[]{2,5,8}); 
     Worker worker3 = new Worker(new int[]{3,6,9}); 

     worker1.setnext(worker3); 
     worker2.setnext(worker1); 
     worker3.setnext(worker2); 

     worker1.start(); 
     worker2.start(); 
     worker3.start(); 

    } 
} 
+2

讓我們看看你已經嘗試什麼樣的代碼 – xkickflip 2013-04-06 05:00:29

+0

JST補充說,我試過代碼..感覺messup,所以我沒有以前添加... – user1983527 2013-04-06 05:05:19

+0

你打算用做這個代碼?有很多其他的方式輸出順序 – BlackJoker 2013-04-06 05:07:08

回答

4

試試我的版本。請注意,等待應始終在循環中使用。

public class Worker extends Thread { 
    int[] val; 
    Worker next; 
    boolean ready; 
    boolean go; 

    Worker(int[] val) { 
     this.val = val; 
    } 

    public void setNext(Worker next) { 
     this.next = next; 
    } 

    @Override 
    public void run() { 
     synchronized (Worker.class) { 
      ready = true; 
      Worker.class.notifyAll(); 
      for (int i = 0; i < val.length; i++) { 
       try { 
        while (!go) { 
         Worker.class.wait(); 
        } 
        System.out.println(val[i]); 
        go = false; 
        next.go = true; 
        Worker.class.notifyAll(); 
       } catch (InterruptedException e) { 
       } 
      } 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     Worker worker1 = new Worker(new int[] { 1, 4, 7 }); 
     Worker worker2 = new Worker(new int[] { 2, 5, 8 }); 
     Worker worker3 = new Worker(new int[] { 3, 6, 9 }); 

     worker1.setNext(worker2); 
     worker2.setNext(worker3); 
     worker3.setNext(worker1); 

     worker1.start(); 
     worker2.start(); 
     worker3.start(); 

     synchronized (Worker.class) { 
      while(!worker1.ready || !worker2.ready ||!worker3.ready) { 
       Worker.class.wait(); 
      } 
      worker1.go = true; 
      Worker.class.notifyAll(); 
     } 
    } 
} 

輸出

1 
2 
3 
4 
5 
6 
7 
8 
9 
+0

感謝您的幫助 – user1983527 2013-04-06 06:59:58