2012-11-25 41 views
6

Tôi có hai bộ đếm thời gian để quản lý đầu vào (en-queue) và đầu ra (dequeue) từ một hàng đợi FIFO nhưng tôi tiếp tục nhận được một ngoại lệ cho việc dequeueing java.lang.IllegalStateException: Timer đã bị hủy bỏ. Tôi không thể đặt một điểm dừng để gỡ lỗi dòng nơi lỗi được tuyên bố xảy ra dòng 83. Tôi không biết những gì tôi đang thiếu nên bất kỳ trợ giúp sẽ được đánh giá cao.Timer đã bị hủy

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

Và dấu vết ngăn xếp đầy đủ của ngoại lệ là ...? Và dòng 83 là ...? –

+0

java.lang.IllegalStateException: Bộ hẹn giờ đã bị hủy. \t tại java.util.Timer.sched (Timer.java:354) \t tại java.util.Timer.schedule (Timer.java:222) \t tại RunSim.start (RunSim.java:83) \t tại RunSim.main (RunSim.java:47) Dòng 83: t2.schedule (new removePacket(), 5,5); – Vhas

Trả lời

9

Ngay sau khi lên lịch tất cả các bộ hẹn giờ, bạn hủy chúng. Điều này không hoạt động như ExecutorService nơi bạn có thể lên lịch tất cả những gì bạn cần và sau đó gọi shutdown — điều này thực sự hủy bộ hẹn giờ và tất cả các tác vụ đã lên lịch.

Một vấn đề khác với mã của bạn là bạn gọi System.exit ngay lập tức, không đưa ra bất kỳ cơ hội nào cho các tác vụ được lên lịch để thực sự chạy.

Ngoài những vấn đề đó, bạn có thể nhận được một ngoại lệ Timer already canceled nếu một nhiệm vụ trước đó đã ném một ngoại lệ. Ngoại lệ sẽ không được nhìn thấy ở bất cứ đâu, nhưng nó sẽ hủy hẹn giờ. Hãy chắc chắn để bọc nhiệm vụ bộ đếm thời gian của bạn thành một câu lệnh try-all catch-all.

+0

Ngay cả khi tôi không có những dòng hẹn giờ t2 sẽ hủy bỏ một cách bí ẩn. Nhưng tôi sẽ loại bỏ chúng. – Vhas

+2

Vấn đề về việc gói một nhiệm vụ trong một khối catch-all là rất quan trọng. Tài liệu Timer đề cập đến điều này (elliptically, IMO) bằng cách nói: "Nếu chuỗi thực hiện nhiệm vụ của timer chấm dứt đột ngột, ví dụ, vì phương thức dừng của nó được gọi, bất kỳ nỗ lực nào nữa để lên lịch một tác vụ trên bộ hẹn giờ sẽ dẫn đến một IllegalStateException, như thể phương thức hủy hẹn giờ đã được gọi. " Bit chính được "chấm dứt bất ngờ" ... –

Các vấn đề liên quan