2017-04-30 1 views
0

Ich habe folgenden Code. Der Code erstellt zwei Runnables mit Nachrichten "Hallo" und "Welt" jeweils. Ich erwarte, dass "Hello" mit "World" ausgetauscht wird, aber es funktioniert nicht. Der Code bleibt stecken und der Austausch findet nie statt.Java Exchanger-Beispiel funktioniert nicht

Der Code wurde wie folgt geändert. Es funktioniert jetzt

public class ExchangerExample { 

public static void main(String[] args) { 
    Exchanger<String> exchanger = new Exchanger(); 

    new Thread(() -> { 
     try { 
      String message = "Hello"; 
      Object previous = message; 
      message = exchanger.exchange(message); 
      System.out.println(previous + " is changed to " + message); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    }).start(); 

    new Thread(() -> { 
     try { 
      String message = "World"; 
      Object previous = message; 
      message = exchanger.exchange(message); 
      System.out.println(previous + " is changed to " + message); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    }).start(); 
} 

}

+1

Ihr Programm funktioniert gut mit mir es print 'Welt ist zu Hallo geändert Hallo ist zu World' geändert! –

Antwort

0

zunächst das alles ist kein gutes Design für ein solches Programm zu schreiben, sieht aus wie Spagetti-Code, schreiben Sie zunächst eine ExchangerRunnable Klasse:

public class ExchangerRunnable implements Runnable{ 

    Exchanger exchanger = null; 
    Object object = null; 

    public ExchangerRunnable(Exchanger exchanger, Object object) { 
     this.exchanger = exchanger; 
     this.object = object; 
    } 

    public void run() { 
     try { 
      Object previous = this.object; 

      this.object = this.exchanger.exchange(this.object); 

      System.out.println(
        Thread.currentThread().getName() + 
        " exchanged " + previous + " for " + this.object 
      ); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

dann können Sie verwenden Sie es wie folgt:

Exchanger exchanger = new Exchanger(); 

ExchangerRunnable exchangerRunnable1 = 
     new ExchangerRunnable(exchanger, "Hello"); 

ExchangerRunnable exchangerRunnable2 = 
     new ExchangerRunnable(exchanger, "World"); 

new Thread(exchangerRunnable1).start(); 
new Thread(exchangerRunnable2).start(); 

die Ausgabe wird:

Thread-0 exchanged Hello for World 
Thread-1 exchanged World for Hello 

irgendwelche probleme?