我有两个计时器来管理FIFO队列的输入(en-queue)和输出(dequeue)但是我一直得到一个异常的java.lang.IllegalStateException:Timer已经被取消了。我不能停止调试行声称错误发生在第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);
}
}
}
答案 0 :(得分:10)
在安排所有计时器之后,您立即取消它们。这不像ExecutorService
那样可以安排你所需要的所有内容然后调用shutdown
- 这实际上取消了计时器和所有计划任务。
您的代码的另一个问题是您立即致电System.exit
,而不是让任何计划任务实际运行的机会。
除了这些问题之外,如果上一个任务引发异常,您可能会收到Timer already canceled
异常。在任何地方都不会看到异常,但会取消定时器。一定要把你的计时器任务包装成一个catch-all try-statement。