2012-11-25 16 views
6

Ho due timer per gestire l'input (en-queue) e l'output (dequeue) da una coda FIFO ma continuo ad ottenere un'eccezione per il dequeueing java.lang.IllegalStateException: Timer già cancellato. Non riesco a porre fine alla linea di debug in cui si afferma che l'errore si verifichi riga 83. Non so cosa mi manca quindi qualsiasi aiuto sarebbe apprezzato.Timer già cancellato

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

E la traccia dello stack completo dell'eccezione è ...? E la linea 83 è ...? –

+0

java.lang.IllegalStateException: timer già cancellato. \t a java.util.Timer.sched (Timer.java:354) \t a java.util.Timer.schedule (Timer.java:222) \t a RunSim.start (RunSim.java:83) \t a RunSim.main (RunSim.java:47) Riga 83: t2.schedule (nuovo removePacket(), 5,5); – Vhas

risposta

9

Immediatamente dopo aver programmato tutti i timer, li si annulla. Questo non funziona come lo ExecutorService dove puoi programmare tutto ciò di cui hai bisogno e chiamare lo shutdown — in questo modo annulla il timer e tutte le attività programmate.

Un altro problema con il codice è che si chiama System.exit subito, non dando alcuna possibilità alle attività pianificate di essere effettivamente eseguite.

Oltre a questi problemi, è possibile ottenere un'eccezione Timer already canceled se un'attività precedente ha generato un'eccezione. L'eccezione non verrà visualizzata da nessuna parte, ma annullerà il timer. Assicurati di avvolgere i tuoi compiti del timer in una dichiarazione try-catch-all.

+0

Anche quando non avevo quelle righe, il timer t2 sarebbe misteriosamente annullato. Ma li rimuoverò. – Vhas

+2

Il punto su come avvolgere un'attività in un blocco catch-all è cruciale. La documentazione del Timer fa riferimento a questo (in senso ellittico, IMO) dicendo: "Se il thread di esecuzione del task del timer termina in modo imprevisto, ad esempio, poiché viene richiamato il metodo stop, qualsiasi ulteriore tentativo di pianificare un'attività sul timer provocherà un IllegalStateException, come se il metodo di annullamento del timer fosse stato invocato. " Il bit chiave "termina in modo imprevisto" ... –