Minuterie déjà annulée
J'ai deux minuteries pour gérer la saisie(en file d'attente) et de sortie (file d'attente) à partir d'une file d'attente FIFO, mais je reçois une exception pour le dequeueing java.lang.IllegalStateException: Minuterie déjà annulé. Je ne peux pas placer un stop de débogage de la ligne où l'erreur est revendiquée pour produire de la ligne 83. Je ne sais pas ce que je suis absent de sorte que toute aide serait appréciée.
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
/**
* RunSim
*/
public class RunSim {
private double arrivalRate = 600;
private double y;
private Timer t;
private Timer t2;
private Queue fifoQueue;
private long xy;
private long fact = 10;
private int count;
private int pId;
public RunSim() {
Random r = new Random();
long n = System.currentTimeMillis();
r.setSeed(n);
double i = r.nextDouble();
y = ((1 / arrivalRate) * (Math.log(i)));
xy = (long) y;
t = new Timer();
t2 = new Timer();
fifoQueue = new Queue();
count = 0;
pId = 0;
}
public static void main() {
RunSim rs = new RunSim();
rs.start();
}
public void start() {
class sendPacket extends TimerTask {
public void run() {
Packet p = new Packet();
p.setId(pId);
fifoQueue.insert(p);
p.setArrivalTime();
System.out.println("ID: " + p.getId() + " Arrival Time: "
+ p.getArrivalTime() / fact);
pId++;
}
}
class removePacket extends TimerTask {
public void run() {
fifoQueue.first().setDepartureTime();
System.out.println("ID: " + fifoQueue.first().getId()
+ " Departure Time: "
+ fifoQueue.first().getDepartureTime() / fact);
fifoQueue.remove();
}
}
while (count < 1000) {
long v = fact * (1 + Math.abs(xy));
t.schedule(new sendPacket(), 0, v);
count++;
t2.schedule(new removePacket(), 5, 5);
}
}
}
Et le full stack trace de l'exception est...? Et ligne 83 est... ?
java.lang.IllegalStateException: Minuterie déjà annulé. à java.util.Minuterie.sched(Minuterie.java:354) at java.util.Minuterie.horaire(Timer.java:222) à RunSim.start(RunSim.java:83) à RunSim.principale(RunSim.java:47) de la Ligne 83: t2.annexe(nouveau removePacket(),5,5);
java.lang.IllegalStateException: Minuterie déjà annulé. à java.util.Minuterie.sched(Minuterie.java:354) at java.util.Minuterie.horaire(Timer.java:222) à RunSim.start(RunSim.java:83) à RunSim.principale(RunSim.java:47) de la Ligne 83: t2.annexe(nouveau removePacket(),5,5);
OriginalL'auteur Vhas | 2012-11-25
Vous devez vous connecter pour publier un commentaire.
Immédiatement après la planification de tous les compteurs à zéro, vous les annuler. Cela ne fonctionne pas comme le
ExecutorService
où vous pouvez planifier tout ce que vous devez et ensuite appelershutdown
—ce qui annule la minuterie et de toutes les tâches planifiées.Un autre problème avec votre code, c'est que vous appelez
System.exit
tout de suite, ne donnant aucune chance pour les tâches planifiées pour exécuter.En dehors de ces problèmes, vous pouvez obtenir un
Timer already canceled
exception si une tâche précédente a généré une exception. L'exception ne pourra être vu n'importe où, mais il va annuler la minuterie. Assurez-vous d'envelopper votre minuteur de tâches dans un fourre-tout essayer.Le point sur l'ajustement d'une tâche dans un fourre-tout d'un bloc est crucial. La Minuterie de la documentation fait référence à cette (elliptique, OMI) en disant: "Si la minuterie de l'exécution de la tâche thread se termine de façon inattendue, par exemple, parce que la méthode est appelée, toute tentative pour planifier une tâche sur le minuteur va entraîner une IllegalStateException, comme si la minuterie d'annulation de la méthode a été invoquée." Le plus important étant de "s'arrête de façon inattendue"...
OriginalL'auteur Marko Topolnik