2017-09-22 1 views
-3

Ich arbeite am Multi-Threading. In meinem Programm habe ich drei Threads, die man druckt hello1, fädle zwei Drucke hello2 und fädle drei Drucke hello3. Ich beginne die die Fäden simultaneously.I der AusgangWie mehrere Threads nacheinander ausgeführt werden

hello1 hello2 hello3 hello1 hello2 sein wollen hello3 und so weiter ...

aber jedes Mal, ich bin mit dem Programm seine verschiedenen geben Ausgänge wie Hallo2 Hallo1 Hallo3, Hallo1 Hallo3 Hallo2. Ich möchte die Ausgabe in einer Sequenz von 1 2 3. werden, um den Code unten

package javaapplication2; 


public class ThreadDemo { 

void MyThread() { 
    boolean st = true; 
    Thread t1 = new Thread() { 
     @Override 
     public void run() { 

      for (int x = 0; x < 8; x++) { 

       try { 
        System.out.println("hello " + 1); 

        wait(); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    }; 
    //thread 2 
    Thread t2 = new Thread() { 
     @Override 
     public void run() { 

      for (int x = 0; x < 8; x++) { 

       try { 
        System.out.println("hello " + 2); 
        //Thread.sleep(2000); 
        wait(); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    }; 
    //thraed 3 
    Thread t3 = new Thread() { 
     @Override 
     public void run() { 

      for (int x = 0; x < 8; x++) { 

       try { 
        System.out.println("hello " + 3); 
        Thread.sleep(2000); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    }; 

    t1.start(); 
    try{ 
     t1.join(); 
    }catch (Exception e){ 

    } 
    t2.start(); 
    try{ 
     t2.join(); 
    }catch (Exception e){ 

    } 
    t3.start(); 
    try{ 
     t3.join(); 
    }catch (Exception e){ 

    } 
} 

public static void main(String[] args) { 

    new ThreadDemo().MyThread(); 
} 
} 
+6

Was ist der Sinn der Verwendung von Threads, wenn Sie sie nacheinander ausführen? – Reimeus

+1

Sie ignorieren nur alle Ausnahmen, die sich aus dem Aufruf von 'wait()' außerhalb eines Synchronisierungsblocks ergeben? – Kayaman

+1

Sie brauchten eine geeignete Synchronisation, schauen Sie sich die CyclicBarrier-Klasse an https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CyclicBarrier.html – DaysLikeThis

Antwort

0

Threads gegeben ist gemeint sind, die Leistung das Programm zu verbessern, was passiert, wenn 2 oder mehr Threads parallel läuft ein zu erreichen gemeinsames Ziel. Also, es hat keinen Sinn, die Threads der Reihe nach auszuführen. Es ist dasselbe wie Sie haben 3 Methoden, die nacheinander ausgeführt werden. In diesem Fall ist es nicht sinnvoll, Threading zu verwenden.

jedoch ändern Sie Ihr Programm in folgenden Art und Weise der gewünschte Ausgabe zu erreichen:

public class ThreadDemo { 
void MyThread() { 
    // boolean st = true; 
    Thread t1 = new Thread() { 
     @Override 
     public void run() { 

      for (int x = 0; x < 8; x++) { 

       try { 
        System.out.println("hello " + x); 

       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    }; 
    // thread 2 
    Thread t2 = new Thread() { 
     @Override 
     public void run() { 

      for (int x = 0; x < 8; x++) { 

       try { 
        System.out.println("hello " + x); 

       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    }; 
    // thraed 3 
    Thread t3 = new Thread() { 
     @Override 
     public void run() { 

      for (int x = 0; x < 8; x++) { 

       try { 
        System.out.println("hello " + x); 

       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    }; 

    t1.start(); 
    try { 
     t1.join(); 
    } catch (Exception e) { 

    } 
    t2.start(); 
    try { 
     t2.join(); 
    } catch (Exception e) { 

    } 
    t3.start(); 

} 

public static void main(String[] args) { 

    new ThreadDemo().MyThread(); 
} 
} 
1

können Sie SynchronousQueue verwenden und machen diese zu einem Staffellauf mit jedem Thread den Stick zum nächsten übergeben. Nur der Thread mit dem Stick kann seine Nutzlast drucken.

void go() { 
    SynchronousQueue<Object> t1ToT2 = new SynchronousQueue<>(); 
    SynchronousQueue<Object> t2ToT3 = new SynchronousQueue<>(); 
    SynchronousQueue<Object> t3ToT1 = new SynchronousQueue<>(); 
    Object theStick = new Object(); 

    Thread t1 = new Thread(() -> { 
     try { 
      for (int x = 0; x < 8; x++) { 
       Object stick = t3ToT1.take(); 
       System.out.println("hello " + 1); 
       t1ToT2.put(stick); 
      } 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    }); 
    //thread 2 
    Thread t2 = new Thread(() -> { 
     try { 
      for (int x = 0; x < 8; x++) { 
       Object stick = t1ToT2.take(); 
       System.out.println("hello " + 2); 
       t2ToT3.put(stick); 
      } 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    }); 
    //thread 3 
    Thread t3 = new Thread(() -> { 

     try { 
      for (int x = 0; x < 8; x++) { 
       Object stick = t2ToT3.take(); 
       System.out.println("hello " + 3); 
       t3ToT1.put(stick); 
      } 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    }); 

    t1.start(); 
    t2.start(); 
    t3.start(); 


    try { 
     t3ToT1.put(theStick); 
     t1.join(); 
     t2.join(); 
     t3.join(); 
    } catch (InterruptedException e) { 
     Thread.currentThread().interrupt(); 
    } 
} 
+0

Oder für eine noch esoterischere (aber passende) Klasse, verwenden Sie [Exchanger] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Exchanger.html). – Kayaman

+0

@Kayaman Ich frage mich, wie Sie das tun würden? – bowmore

+0

Ändert den Code nicht wirklich, ersetzen Sie die Warteschlangen durch Tauscher. – Kayaman

Verwandte Themen