J'ai une version courte de la question:Est-ce un bon moyen de fermer un thread?
- Je commence un fil comme ça:
counter.start();
, oùcounter
est un fil. - Au moment où je veux arrêter le fil je fais ça:
counter.interrupt()
- Dans mon fils je fais régulièrement cette vérification:
Thread.interrupted()
. S'il donnetrue
Ireturn
du thread et, par conséquent, il s'arrête.
Et voici quelques détails, si nécessaire:
Si vous avez besoin de plus de détails, ils sont ici. A partir du fil d'expédition inventer je commence un fil de compteur de cette façon:
public static void start() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
showGUI();
counter.start();
}
});
}
où le fil est défini comme:
public static Thread counter = new Thread() {
public void run() {
for (int i=4; i>0; i=i-1) {
updateGUI(i,label);
try {Thread.sleep(1000);} catch(InterruptedException e) {};
}
// The time for the partner selection is over.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.remove(partnerSelectionPanel);
frame.add(selectionFinishedPanel);
frame.invalidate();
frame.validate();
}
});
}
};
Le fil effectue le compte à rebours dans la fenêtre « première » (il montre la maison beaucoup de temps à gauche). Si la limite de temps est terminée, le thread ferme la "première" fenêtre et en génère une nouvelle. Je veux modifier mon fil de la manière suivante:
public static Thread counter = new Thread() {
public void run() {
for (int i=4; i>0; i=i-1) {
if (!Thread.interrupted()) {
updateGUI(i,label);
} else {
return;
}
try {Thread.sleep(1000);} catch(InterruptedException e) {};
}
// The time for the partner selection is over.
if (!Thread.interrupted()) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.remove(partnerSelectionPanel);
frame.add(selectionFinishedPanel);
frame.invalidate();
frame.validate();
}
});
} else {
return;
}
}
};
AJOUTÉE:
En raison de certaines raisons pour lesquelles il ne fonctionne pas. J'ai une méthode qui interrompt le fil:
public static void partnerSelected() {
System.out.println("The button is pressed!!!!");
counter.interrupt();
}
Cette méthode est activée lorsqu'un bouton est enfoncé. Quand j'appuie sur le bouton, je vois la sortie correspondante dans le terminal (donc cette méthode est activée et elle fait quelque chose). Mais à cause de certaines raisons, il n'interrompt pas le fil. Voici le code du fil:
public static Thread counter = new Thread() {
public void run() {
for (int i=40; i>0; i=i-1) {
if (Thread.interrupted()) {
System.out.println("Helloo!!!!!!!!!!!!!!!");
return;
}
updateGUI(i,label);
try {Thread.sleep(1000);} catch(InterruptedException e) {};
}
// The time for the partner selection is over.
if (Thread.interrupted()) {
System.out.println("Helloo!!!!!!!!!!!!!!!");
return;
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.remove(partnerSelectionPanel);
frame.add(selectionFinishedPanel);
frame.invalidate();
frame.validate();
}
});
}
};
P.S. Je ne vois pas "Bonjour !!!!!!!!!!!!!" dans le terminal ...
wiki communautaire? –
@Jamie: Pas question Jose. C'est une question "standard" légitime. –
@OP: Re votre édition: Vous devez réaffirmer l'état interrompu (voir mon article) dans le bloc 'catch' (pour votre' Timer.sleep'). –