Dans mon thread principal, j'envoie des données au serveur via HttpURLConnection, puis je démarre un timer
pour exécuter un TimerTask périodiquement pour vérifier la réponse du serveur. Quand j'obtiens la chaîne attendue, j'appelle timer.cancel()
. Après cela, le thread principal reprend à partir de l'endroit où le timer
est démarré.Comment supprimer le thread principal jusqu'à ce qu'un thread TimerTask invoqué par le thread principal soit terminé?
J'imagine code suivant simplifié avec le même mécanisme juste pour ce poste:
public class Test {
public static void main(String[] args) throws InterruptedException {
System.out.println("start");
Timer timer = new Timer();
TmTask timerTask = new TmTask(timer);
Thread thread = new Thread(timerTask,"thread_1");
thread.start();
thread.join();
System.out.println("end");
}
}
class TmTask extends TimerTask{
Timer t;
public TmTask(Timer t){
this.t = t;
}
@Override
public void run() {
t.schedule(new A(t), 100, 1000);
}
}
class A extends TimerTask{
private Timer t;
private int i = 0;
public A(Timer t) {
this.t = t;
}
@Override
public void run() {
System.out.println("abc");
i++;
if (i == 3) t.cancel();
}
}
Mon expection est:
start
abc
abc
abc
end
Mais je reçois:
start
end
abc
abc
abc
Enfin, je réalise que dans mon code il y a 3 threads créés mais je m'attendais à 2 (thread principal et thread Timer), et le join()
méthode fonctionne sur le thread nommé thread_1
au lieu du thread de minuterie. Mais je n'ai aucune idée de comment l'améliorer.
Quelqu'un peut-il m'aider? Merci d'avance.
Pourquoi voulez-vous réutiliser le fil? Lorsque vous l'attendez dans le thread principal, vous pouvez simplement l'exécuter sur le thread principal ... – Lino
Cela casserait l'idée d'un fil. Vous voulez utiliser des threads pour le travail asynchrone. Ce que vous voulez faire, c'est le forcer à être synchrone. –
En aucun cas, une TimerTask ne doit contenir une référence à un Timer. La tâche * est * le travail de fond; il ne devrait pas * commencer * d'autres travaux de fond. – VGR