2010-11-23 3 views
12

In einem Multi-threaded Java-Programm, was passiert, wenn ein Thread-Objekt T instanziiert wurde, und hat T.join() aufgerufen, bevor der Thread gestartet wurde? Angenommen, ein anderer Thread könnte T. start() jederzeit aufrufen, nachdem T instanziiert wurde, entweder bevor oder nachdem ein anderer Thread T.join() aufgerufen hat.Was ist das Verhalten von Thread.join() in Java, wenn das Ziel noch nicht gestartet wurde?

Ich frage, weil ich denke, dass ich ein Problem habe, wo T.join() vor T.start() aufgerufen wurde, und der Thread, der T.join() aufruft, hängt.

Ja, ich weiß, dass ich einige Designprobleme habe, die, wenn behoben, dies zu einem Nicht-Problem machen könnten. Ich würde jedoch gerne die Besonderheiten des join() Verhaltens kennen, denn das einzige, was die Java-API-Dokumentation sagt, ist "Wartet darauf, dass dieser Thread stirbt."

+1

Versuchen Sie es. Mach ein anderes einfaches Projekt und schau was passiert. – BeemerGuy

+3

BeemerGuy: Vielleicht werde ich irgendwann. Ich bin jedoch nicht davon überzeugt, dass nur durch Versuch und Irrtum klar wird, was hinter den Kulissen vor sich geht. Es gibt immer die Chance, die jemand anderes bereits weiß, und kann mir die Zeit sparen. – DGH

Antwort

11

Es wird nur zurückkehren. Siehe Code unten - isAlive() wird falsch sein, bevor der Thread startet, also wird nichts passieren.

public final synchronized void join(long millis) 
    throws InterruptedException { 
    long base = System.currentTimeMillis(); 
    long now = 0; 

    if (millis < 0) { 
      throw new IllegalArgumentException("timeout value is negative"); 
    } 

    if (millis == 0) { 
     while (isAlive()) { 
     wait(0); 
     } 
    } else { 
     while (isAlive()) { 
     long delay = millis - now; 
     if (delay <= 0) { 
      break; 
     } 
     wait(delay); 
     now = System.currentTimeMillis() - base; 
     } 
    } 
    } 

Der Code-Snippet ist © Copyright Oracle 2006 und/oder mit ihrem verbundenen Unternehmen und found here sein kann. Lizenziert unter Java Research License.

+0

Was Sie hier eingefügt haben, ist beitreten (long millis). Was ist mit Join()? Ich denke nicht, dass die Verhaltensweisen für beide Methoden gleich sind. – DGH

+0

@DGH: Join() ruft Join (0) auf. –

+0

@Nathan Hughes: Okay, das erklärt es, danke. – DGH

-1

Es sollte unendlich lange auf das Ende des Threads warten ... was in Ihrem Fall nie so weit geschieht, wie ich es verstehe.

Verwandte Themen