2016-09-08 1 views
-1

EDIT: Ok, das ist wirklich dumm, aber ich weiß nicht, warum ich nicht sah, war es eine normale Schleife ohne die üblichen Inkremente. Ich hoffe, ich war betrunken, als ich diese Frage gestellt habe, weil ich mich jetzt super idiotisch fühle. Danke trotzdem Jungs!Java Oracle Beispiel auf geschützten Blöcken

Ich folge einigen Tutorials auf Java Multi-Threading, um so viele Informationen und Beispiele wie möglich zu sammeln.

Auf der Oracle-Website gibt es ein offizielles Tutorial zu Java Concurrency und ich betrachte den Abschnitt Geschützte Blöcke (here).

Während alle Konzepte klar sind, lese ich das Producer/Consumer Beispiel unten auf der Seite und ich verstehe einige Teile des Codes nicht.

Speziell im folgenden ist der Code für die Methode run() der Consumer-Klasse, wo ich nicht verstehe, wie diese for-Schleife funktionieren soll. Es sieht nicht einmal so aus, wie es für mich funktionieren kann.

Kann mir jemand erklären?

public void run() { 
     Random random = new Random(); 
     for (String message = drop.take(); 
      ! message.equals("DONE"); 
      message = drop.take()) { 
      System.out.format("MESSAGE RECEIVED: %s%n", message); 
      try { 
       Thread.sleep(random.nextInt(5000)); 
      } catch (InterruptedException e) {} 
     } 
    } 

Antwort

0

Es ist nur for-Schleife, die in einer nicht-idiomatischen Weise verwendet wird.

Sie haben die Initialisierung String message = drop.take(); (anstelle von int i = 0;).

Dann haben Sie den Test !message.equals("DONE"); (anstelle von i < 10).

Schließlich haben Sie die "Inkrement" oder Schleife-Fortschritt oder was auch immer der eigentliche Begriff ist. Holen Sie den nächsten Wert mit message = drop.take(); (statt i++).

0

Vielleicht wäre es einfacher, wenn sie auf eine while-Schleife umgewandelt zu verstehen:

public void run() { 
    Random random = new Random(); 

    String message = drop.take() 
    while (!message.equals("DONE")) { 
     System.out.format("MESSAGE RECEIVED: %s%n", message); 
     try { 
      Thread.sleep(random.nextInt(5000)); 
     } catch (InterruptedException e) {} 
     message = drop.take() 
    } 
} 

Beachten Sie, dass die for-Schleife im Allgemeinen besteht aus drei Teilen:

for (INITIALIZATION; CONDITION; AFTERTHOUGHT) 
{ 
// Code for the for-loop's body goes here. 
} 

INITIALISIERUNG ausgeführt Vor der ersten Iteration wird CONDITION vor jeder Iteration überprüft und AFTERTHOUGHT wird nach jeder Iteration ausgeführt.

(Entnommen https://en.wikipedia.org/wiki/For_loop#Traditional_for-loops)

also in diesem Beispiel die Initialisierung der for-Schleife erzeugt die Nachricht variabel und nimmt die erste Nachricht von Tropfen. Es prüft es dann im CONDITION-Block, um zu sehen, ob es irgendetwas anderes als DONE ist. Wenn dies der Fall ist, wird der Schleifenkörper einmal ausgeführt, wobei die Nachricht gedruckt und bis zu 5000 Millisekunden lang geschlafen wird. Dann wird die nächste Nachricht in der AFTERTHOUGHT-Klausel genommen und die Schleifen prüft den CONDITION-Block erneut, um entweder die nächste Nachricht auszugeben oder die Schleife zu verlassen, sobald sie DONE erhält.