2010-11-23 2 views
12

Dans un programme java multithread, que se passe-t-il si un objet thread T a été instancié, et que T.join() a été appelé avant le démarrage du thread? Supposons qu'un autre thread puisse appeler T.start() à tout moment après l'instanciation de T, avant ou après un autre thread appelé T.join().Quel est le comportement de Thread.join() dans Java si la cible n'a pas encore démarré?

Je demande parce que je pense que j'ai un problème où T.join() a été appelé avant T.start(), et le thread appelant T.join() se bloque. Oui, je sais que j'ai des problèmes de conception qui, s'ils sont corrigés, pourraient faire en sorte que ce problème ne se pose pas. Cependant, j'aimerais connaître les spécificités du comportement join(), car la seule chose que les docs de l'API Java disent est "Attend que ce thread meure".

+1

Essayez-le. Faire un autre projet simple et voir ce qui se passe. – BeemerGuy

+3

BeemerGuy: Peut-être que je le ferai, à un moment donné. Cependant, je ne suis pas convaincu que les essais et les erreurs éclaireront à eux seuls ce qui se passe dans les coulisses. Il y a toujours une chance que quelqu'un d'autre connaisse déjà et cela peut me faire gagner du temps. – DGH

Répondre

11

Il reviendra juste. Voir le code ci-dessous - isAlive() sera faux avant que le thread ne démarre, donc rien ne se passera.

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; 
     } 
    } 
    } 

L'extrait de code est © Copyright Oracle 2006 et/ou de ses filiales, et peuvent être found here. Sous licence Java Research License.

+0

Ce que vous avez collé ici est join (long millis). Qu'en est-il de rejoindre()? Je ne pense pas que les comportements sont les mêmes pour les deux méthodes. – DGH

+0

@DGH: les appels join() rejoignent (0). –

+0

@Nathan Hughes: D'accord, ça explique, merci. – DGH

-1

Il devrait attendre indéfiniment que le fil finisse ... ce qui dans votre cas ne se produit jamais autant que je sache.

Questions connexes