2016-03-21 7 views
-1

Ich verstehe nicht ganz, warum ich diese Ausgabe für diesen Code zu erhalten:Thread ausgeführt wird nicht trotz der Methode join

public class Example { 

    static void threadMessage(String message) { 
     String threadName = 
      Thread.currentThread().getName(); 
     System.out.format("%s: %s%n", threadName, message); 
    } 

    private static class MessageLoop implements Runnable { 
     public void run() { 
      String importantInfo[] = { 
       "Line 1", 
       "Line 2", 
       "Line 3", 
       "Line 4" 
      }; 
      try { 
       for (int i = 0; i< importantInfo.length; i++) { 
        // Pause for 4 seconds 
        Thread.sleep(4000); 
        // Print a message 
        threadMessage(importantInfo[i]); 
       } 
      } catch (InterruptedException e) { 
       ; 
      } 
     } 
    } 

    public static void main(String args[]) throws InterruptedException { 


     threadMessage("Starting MessageLoop thread"); 
     Thread t = new Thread(new MessageLoop()); 
     t.start(); 

     threadMessage("Waiting for MessageLoop thread to finish"); 

     while (t.isAlive()) { 
      threadMessage("Still waiting..."); 
      // Wait maximum of 1 second 
      // for MessageLoop thread 
      // to finish. 
      t.join(1000); 
     } 
     threadMessage("Finally!"); 
    } 
} 

Ausgang:

 
main: Starting MessageLoop thread 
main: Waiting for MessageLoop thread to finish 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 1 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 2 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 3 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 4 
main: Finally! 

wenn ich schreibe diese Aussage innen Die Schleife, Thread main fährt mit seiner Ausführung fort. Es ist nicht anzunehmen, dass thread main mit seiner Ausführung fortfahren soll, nachdem thread t beendet wurde?

t.join (1000);

Der Bucle setzt jedoch seine Ausführung fort. Mein Wissen gehören diese zwei Linien Haupt einzufädeln - während (t.isAlive()) - threadMessage („Ich warte immer noch ...“)

Ich versuche, ein Beispiel für diesen Link zu verstehen:

Java tutorial

Vielen Dank im Voraus für Ihre Hilfe !!!

+1

Was Sie nicht in der Ausgabe verstehen ? Welche Leistung würden Sie erwarten und warum? –

Antwort

2

Werfen Sie einen Blick auf join() Methodendokumentation here. Dies ist, was sagt:

Warte auf Millisekunden Millisekunden für diesen Thread zu sterben.

Sie passieren 1.000-join(), das bedeutet, wird Haupt-Thread 1 Sekunde warten höchstens, bevor Sie fortfahren, und zwar unabhängig davon, ob thread t abgeschlossen ist. Thread t hat Sleep-Timeout von 4 Sekunden und daher wird Haupt-Thread immer vor t (nach Join Timing-Out) abgeschlossen.

Wenn der Haupt-Thread für immer warten soll, müssen Sie join() verwenden (d. H. Ohne Argument).

+0

Ausgezeichnet, das war mir klar. Vielen Dank!!! – William

1
while (t.isAlive()) { 
    threadMessage("Still waiting..."); 
    // Wait maximum of 1 second 
    // for MessageLoop thread 
    // to finish. 
    t.join(1000); 
} 

t.join(1000) bedeutet wartet 1000 Millisekunden für Gewinde t zu sterben. t wird nicht sterben, bis alle Zeilen gedruckt sind. Das Szenario ist t.join(1000) Timedout jede Sekunde und t ist noch am Leben (weil es 4 Sekunden jedes Mal eine Zeile drucken). join(1000) TimedOut und t.isAlive() gilt daher Ihr Hauptthread Still waiting druckt .. würde Sobald Thread t hat ihre Arbeit beendet ist, wird t.isAlive() falsch sein und es bricht die while-Schleife druckt dann Finally

Verwandte Themen