ScheduledThreadPoolExecutor, comment arrêter de classe runnable JAVA
J'ai écrit le code suivant:
import java.util.Calendar;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
class Voter {
public static void main(String[] args) {
ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(2);
stpe.scheduleAtFixedRate(new Shoot(), 0, 1, TimeUnit.SECONDS);
}
}
class Shoot implements Runnable {
Calendar deadline;
long endTime,currentTime;
public Shoot() {
deadline = Calendar.getInstance();
deadline.set(2011,6,21,12,18,00);
endTime = deadline.getTime().getTime();
}
public void work() {
currentTime = System.currentTimeMillis();
if (currentTime >= endTime) {
System.out.println("Got it!");
func();
}
}
public void run() {
work();
}
public void func() {
//function called when time matches
}
}
Je voudrais arrêter le ScheduledThreadPoolExecutor lorsque la touche func() est appelée. Il n'est pas nécessaire pour qu'il fonctionne plus! Je pense que je devrais mettre la fonction func() à l'intérieur des Électeurs de la classe, et de créer une sorte de rappel. Mais peut-être que je peux le faire à partir de l'intérieur de la séance de classe.
Comment puis-je le résoudre correctement?
Je ne suis pas du tout familier avec
ScheduledThreadPoolExecutor
, mais ma première hypothèse serait stpe.shutdown()
. Vous devez faire stpe
accessible à partir de func()
. Il pourrait être raisonnable de commencer un deuxième fil (programmée?) qui court à la date limite de temps et appelle la shutdown()
fonction.OriginalL'auteur Khozzy | 2011-07-21
Vous devez vous connecter pour publier un commentaire.
La
ScheduledThreadPoolExecutor
vous permet d'exécuter votre tâche immédiatement ou de les planifier pour être exécuté au plus tard (vous pouvez définir des périodiques, des exécutions aussi).Donc, si vous utilisez cette classe pour arrêter votre exécution de la tâche de garder à l'esprit ceci:
ScheduledThreadPoolExecutor.shutdown()
sera défini comme l'annulation de votre tâche, et il ne va pas essayer d'interrompre votre fils. Avec cette méthode vous fait éviter l'exécution de nouvelles tâches, et l'exécution de prévue, mais pas commencé tâches.ScheduledThreadPoolExecutor.shutdownNow()
va interrompre le fils, mais comme je l'ai dit dans le premier point de cette liste ...Lorsque vous souhaitez arrêter le planificateur, vous devez faire quelque chose comme ceci:
Mais que faire si vous avez besoin d'arrêter une seule tâche?
La méthode
ScheduledThreadPoolExecutor.schedule(...)
renvoie uneScheduleFuture
c'est une représentation de votre tâche planifiée. Donc, vous pouvez appeler laScheduleFuture.cancel(boolean mayInterruptIfRunning)
méthode pour annuler votre tâche et essayer de l'interrompre si vous en avez besoin.OriginalL'auteur ggarciao