6
votes

Comment la méthode de jointure () de la classe thread est-elle?

Considérez le code suivant:

class ThreadJoinTest{
    public static void main(String[] arguments){
        TimeUnit unit; 
        final Thread taskThread = new Thread(task);
        taskThread.start();
        taskThread.join(unit.millis(timeout));   
     }
}


0 commentaires

3 Réponses :


4
votes

rejoindre () Lorsque vous appuyez sur le thread, attendra que ce fil meure (c.-à-d. Pour la méthode d'exécution de ce fil à faire ..). Ce n'est qu'alors que la ligne ci-dessous dans la référence () sera exécutée. mais donner un délai d'attente dans la jointure (), rendra l'effet de jointure () pour être annulé après le délai d'attente spécifique.

Bien que le délai d'attente se produise, la tâche de tâche sera autorisée à terminer le travail.


4 commentaires

Ainsi, en supposant que le délai d'attente et la tâche ne soit pas encore terminé, est-ce que TaskThread meurt à cause du délai d'attente?


Non, le moment où le délai d'attente se produit, la TaskHread sera autorisée à terminer son travail


Ok l'a eu. Qu'en est-il de la dernière question? S'il vous plaît voir également mon commentaire sur la réponse de Keppil.


Quant à la dernière question, envisagez d'utiliser future.get ()



6
votes
  1. Main sera autorisé à redémarrer dès que Tâchehread est fait.
  2. alors principal sera autorisé à redémarrer et Tâchehread continuera. Les deux threads seront autorisés à finir.
  3. Si la tâche est terminée normalement ou que le délai d'attente est atteint, le principal continuera à exécuter. Il n'y a aucun moyen pour principal de savoir si le délai d'attente s'est produit ou si Tâchehead exécutant fini sans utiliser d'autres moyens de communication.

8 commentaires

Je pense que votre réponse répond aux deux premières questions mais pas la troisième. Depuis que le retour de la jointure est de type void, comment le fil principal sache-t-il si le fil TaskThread a-t-il été compilé normalement ou en raison du délai d'attente?


Alors, c'est une faille dans la conception ..Quelle pensez-vous?


Eh bien, il aurait été bien si rejoindre () a renvoyé une sorte de statut, mais je suppose qu'ils ont juste pensé qu'il existe d'autres moyens de résoudre ce problème si vous avez vraiment besoin de savoir.


Je peux penser à d'autres manières, comme la mise à jour de la structure de données globale par la tâche de Tâchette après la fin. Donc, le thread principal peut connaître le statut simplement en interrogant que la structure de données globale ... Mais cela aurait été agréable s'ils (les concepteurs Java) ont fourni un retour sur Join.


Vous pouvez simplement vérifier Isalive () si vous voulez savoir si TaskThread a fini ou non.


@MarkrotteveEL: Cela ressemble à une bonne alternative. Il ne prouvera pas si le délai d'attente s'est produit ou non, mais cela n'est probablement pas pertinent.


TRUE, mais si vous vérifiez simplement après le retour de la jointure programmée, et renvoie vrai , vous savez que le délai d'attente s'est produite.


@MarkrotteveEL +1 pour suggérer Isalive ()



1
votes

La condition de délai d'attente aura préséance. Lorsque le délai d'attente est atteint, le fil principal et la tâche sont des candidats tout aussi probables pour exécuter.


0 commentaires