2013-04-06 3 views
1

Je ne suis pas en mesure de trouver une solution à ce problème. Je suis déconner à un moment donné, mais pas sûr. Veuillez donner vos suggestions pour surmonter cela.Synchronisation de threads. Impression des valeurs dans le bon sens

Problème:

ont trois rangées, chaque rangée est affectée à fil, sortie doit être dans l'ordre ...

t1 = {1,4,7} t2 = {2,5, 8} = { t3 3,6,9}

résultat attendu

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

Wht i essayé :

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(); 
      } 
     } 
    } 
} 

et classe de test

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

Montrez-nous ce code que vous avez essayé – xkickflip

+0

JST a ajouté le code que j'ai essayé .. senti messup donc je ne l'ai pas ajouté plus tôt .. – user1983527

+0

Qu'est-ce que vous allez faire avec ce code? Il ya beaucoup d'autres façons de sortir en séquence – BlackJoker

Répondre

4

Essayez ma version. Notez que wait doit toujours être utilisé dans une boucle.

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(); 
     } 
    } 
} 

sortie

1 
2 
3 
4 
5 
6 
7 
8 
9 
+0

Merci pour votre aide – user1983527