2012-11-25 9 views
6

Mam dwa liczniki czasu do zarządzania wejściami (kolejką) i wyjściami (usuwanie z kolejki) z kolejki FIFO, ale wciąż otrzymuję wyjątek dla jail.lang.IllegalStateException wyjątku: Odliczanie już anulowane. Nie mogę przestać debugować linii, w której wystąpił błąd linii 83. Nie wiem, czego mi brakuje, więc każda pomoc byłaby doceniana.Timer już odwołany

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); 

     } 
    } 
} 
+1

A pełny ślad stosu wyjątku to ...? A linia 83 to ...? –

+0

java.lang.IllegalStateException: Timer już anulowany. \t w java.util.Timer.sched (Timer.java:354) \t w java.util.Timer.schedule (Timer.java:222) \t w RunSim.start (RunSim.java:83) \t w RunSim.main (RunSim.java:47) Linia 83: t2.schedule (nowy removePacket(), 5,5); – Vhas

Odpowiedz

9

Natychmiast po zaprogramowaniu wszystkich timerów, anulujesz je. To nie działa tak, jak w przypadku ExecutorService, gdzie można zaplanować wszystko, czego potrzebujesz, a następnie zadzwonić pod numer shutdown —, co faktycznie anuluje licznik czasu i wszystkie zaplanowane zadania.

Kolejny problem z kodem polega na tym, że od razu dzwonisz pod numer System.exit, nie dając szansy na wykonanie zaplanowanych zadań.

Oprócz tych problemów można uzyskać wyjątek Timer already canceled, jeśli poprzednie zadanie spowodowało wyjątek. Wyjątek nie będzie widoczny nigdzie, ale spowoduje anulowanie licznika czasu. Pamiętaj, aby zawijać swoje zadania timera do catch-all try-statement.

+0

Nawet gdy nie miałem tych linii, timer t2 w tajemniczy sposób anulował. Ale usunę je. – Vhas

+2

Kluczowe znaczenie ma kwestia zawijania zadania w bloku catch-all. Dokumentacja Timer odnosi się do tego (eliptycznie, IMO), mówiąc: "Jeśli wątek wykonywania zadań timera zakończy się nieoczekiwanie, na przykład, ponieważ jego metoda zatrzymania jest wywoływana, każda kolejna próba zaplanowania zadania na zegarze spowoduje wyjątek IllegalStateException, tak jakby wywołano metodę anulowania timera. " Bit klucza "kończy się nieoczekiwanie" ... –