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)); } }
3 Réponses :
Bien que le délai d'attente se produise, la tâche de tâche sera autorisée à terminer le travail. P> rejoindre () code> Lorsque vous appuyez sur le thread, attendra que ce fil meure forte> (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
() code> 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. strong> p>
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 ()
Main code> sera autorisé à redémarrer dès que Tâchehread code> est
fait. li>
- alors
principal code> sera autorisé à redémarrer et Tâchehread code> continuera. Les deux threads seront autorisés à finir. Li>
- Si la tâche code> 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 code> de savoir si le délai d'attente s'est produit ou si Tâchehead code> exécutant fini sans utiliser d'autres moyens de communication. LI>
ol>
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 () code> 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 () code> si vous voulez savoir si
TaskThread code> 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 code>, vous savez que le délai d'attente s'est produite.
@MarkrotteveEL +1 pour suggérer Isalive ()
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. P>