2012-11-25 32 views
6

रद्द मैं एक फीफो कतार से इनपुट (एन कतार) और निर्गम (विपंक्ति) का प्रबंधन करने के दो टाइमर है, लेकिन मैं dequeueing java.lang.IllegalStateException के लिए एक अपवाद हो रही रखने: टाइमर पहले से रद्द कर दिया। मैं डिबग लाइन जहां त्रुटि लाइन 83 होने के लिये मैं नहीं जानता कि मैं क्या इसलिए किसी भी मदद की सराहना की जाएगी याद कर रहा हूँ दावा किया है करने के लिए एक रोकने में असमर्थ हैं।टाइमर पहले से

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

और अपवाद से भरा स्टैक ट्रेस है ...? और लाइन 83 है ...? –

+0

java.lang.IleglegalStateException: टाइमर पहले ही रद्द कर दिया गया है। \t java.util.Timer.sched (Timer.java:354) \t java.util.Timer.schedule पर (Timer.java:222) \t RunSim.start पर (RunSim.java:83) पर \t पर RunSim.main (RunSim.java:47) लाइन 83: t2.schedule (नई removePacket(), 5,5); – Vhas

उत्तर

9

सभी टाइमर शेड्यूल करने के तुरंत बाद, आप उन्हें रद्द कर देते हैं। यह ExecutorService तरह काम नहीं करता है जहाँ आप सभी की जरूरत निर्धारित कर सकते हैं और फिर shutdown — यह वास्तव में टाइमर और सभी अनुसूचित कार्यों को रद्द करता है कहते हैं।

अपने कोड के साथ एक और समस्या यह है कि आप System.exit तुरंत कहते हैं, नहीं वास्तव में चलाने के लिए निर्धारित कार्यों के लिए किसी भी मौका दे रहा है।

अलावा उन समस्याओं से, आप एक Timer already canceled अपवाद अगर पिछले एक कार्य एक अपवाद फेंक दिया हो सकता है। अपवाद कहीं भी नहीं देखा जाएगा, लेकिन यह टाइमर रद्द कर देगा। अपने टाइमर कार्यों को पकड़ने के लिए सुनिश्चित करें - सभी प्रयास-कथन।

+0

यहां तक ​​कि जब मेरे पास उन रेखाएं नहीं थीं टाइमर टी 2 रहस्यमय तरीके से रद्द कर दिया जाएगा। लेकिन मैं उन्हें हटा दूंगा। – Vhas

+2

कैच-ऑल ब्लॉक में एक कार्य लपेटकर के बारे में बात महत्वपूर्ण है। , "टाइमर के कार्य निष्पादन धागा अप्रत्याशित रूप से समाप्त हो जाता है, उदाहरण के लिए, क्योंकि इसके बंद विधि शुरू हो जाती है, किसी भी आगे टाइमर पर एक काम का समय निर्धारित करने का प्रयास एक IllegalStateException में परिणाम होगा: टाइमर प्रलेखन कह कर (दीर्घवृत्त के रूप में, IMO) इस को संदर्भित करता है जैसे कि टाइमर की रद्द विधि लागू की गई थी। " कुंजी बिट "अप्रत्याशित रूप से समाप्त हो रहा है" ... –

संबंधित मुद्दे