2012-11-25 18 views
6

iptal etti. Hata 83 satırda gerçekleştiği iddia edilen satır hata ayıklama yapamıyorum. Ne eksik bilmiyorum, böylece herhangi bir yardım takdir edilecektir.ölçer zaten bir FIFO kuyruğuna girdi (tr-kuyruk) ve çıkış (Dequeue) yönetmek için iki makinelerinde de var ama dequeueing java.lang.IllegalStateException bir istisna almaya devam

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

Özel durumun tam yığın izlemesi ...? Ve çizgi 83 ...? –

+0

java.lang.IllegalStateException: Zamanlayıcı zaten iptal edildi. java.util.Timer.sched (Timer.java:354) java.util.Timer.schedule de \t (Timer.java:222) RunSim.start de \t (RunSim.java:83) en \t \t de RunSim.main (RunSim.java:47) Hat 83: t2.schedule (yeni removePacket(), 5,5); – Vhas

cevap

9

Tüm zamanlayıcıları programladıktan hemen sonra iptal edersiniz. Bu, ihtiyacınız olan her şeyi planlayabileceğiniz ve shutdown — numaralı telefonu arayabileceğiniz ExecutorService gibi çalışmamaktadır; bu, zamanlayıcıyı ve tüm zamanlanmış görevleri iptal eder.

sizin koduyla başka sorun değil aslında yayınlanmasının planlandığı görevlere şansı veren hemen System.exit diyoruz olmasıdır. Bir önceki görev istisna attı eğer

dışında bu sorunları, bir Timer already canceled istisnası alabilirsiniz. İstisna hiçbir yerde görülmeyecek, ancak zamanlayıcıyı iptal edecektir. Zamanlayıcı görevlerinizi bir catch-try denemesine sardığınızdan emin olun.

+0

Bu satırlara sahip olmadığım zamanlarda bile t2 sayacı gizemli bir şekilde iptal olur. Ama onları kaldıracağım. – Vhas

+2

Bir görevin tümünü yakalama blokunda sarmalama noktası çok önemlidir. Zamanlayıcı belgeleri şu ifadeleri kullanır: (eliptik olarak, IMO): "Zamanlayıcı görev yürütme iş parçacığı beklenmedik şekilde sona ererse, örneğin, durdurma yöntemi çağrıldığı için, zamanlayıcıda bir görev zamanlama girişimi, bir IllegalStateException ile sonuçlanır. Zamanlayıcı iptal yöntemi kullanılmış gibi. " Anahtar bit "beklenmedik şekilde sonlandırılıyor" ... –