2012-11-25 6 views
6

Ich habe zwei Timer zum Verwalten der Eingabe (En-Queue) und Ausgabe (Warteschlange) aus einer FIFO-Warteschlange, aber ich bekomme eine Ausnahme für die Aufhebung der Warteschlange java.lang.IllegalStateException: Timer bereits abgebrochen. Ich kann die Debug-Zeile nicht stoppen, wenn der Fehler Zeile 83 gemeldet wird. Ich weiß nicht, was ich vermisse, also würde jede Hilfe geschätzt werden.Timer bereits abgebrochen

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

Und die vollständige Stack-Ablaufverfolgung der Ausnahme ist ...? Und Linie 83 ist ...? –

+0

java.lang.IllegalStateException: Timer ist bereits abgebrochen. \t bei java.util.Timer.sched (Timer.java:354) \t bei java.util.Timer.schedule (Timer.java:222) \t bei RunSim.start (RunSim.java:83) \t bei RunSim.main (RunSim.java:47) Zeile 83: t2.schedule (neues removePacket(), 5,5); – Vhas

Antwort

9

Unmittelbar nach dem Planen aller Timer, stornieren Sie sie. Dies funktioniert nicht wie die ExecutorService, wo Sie alles planen können, was Sie brauchen, und rufen Sie dann shutdown — das tatsächlich storniert den Timer und alle geplanten Aufgaben.

Ein weiteres Problem mit Ihrem Code ist, dass Sie System.exit sofort aufrufen, keine Chance zu den geplanten Aufgaben tatsächlich zu laufen geben.

Abgesehen von diesen Problemen erhalten Sie möglicherweise eine Timer already canceled Ausnahme, wenn eine vorherige Aufgabe eine Ausnahme ausgelöst hat. Die Ausnahme wird nicht angezeigt, aber der Timer wird abgebrochen. Stellen Sie sicher, dass Sie Ihre Timer-Aufgaben in eine Catch-All-Try-Anweisung einfügen.

+0

Selbst wenn ich diese Zeilen nicht hatte, würde der Timer t2 auf mysteriöse Weise abbrechen. Aber ich werde sie entfernen. – Vhas

+2

Der Punkt über das Umbrechen einer Aufgabe in einem Catch-All-Block ist entscheidend. Die Timer-Dokumentation bezieht sich darauf (elliptisch, IMO) mit den Worten: "Wenn der Task-Ausführungs-Thread des Timers unerwartet beendet wird, z. B. weil seine Stopp-Methode aufgerufen wird, führt jeder weitere Versuch, eine Task auf dem Timer zu planen, zu einer IllegalStateException. als ob die Abbruchmethode des Timers aufgerufen worden wäre. " Das Schlüsselbit wird "unerwartet beendet" ... –

Verwandte Themen