计时器已取消

Vha*_*has 12 java multithreading timer timertask

我有两个定时器从FIFO队列管理输入(EN-队列)和输出(离队),但我不断收到的出队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);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 10

在安排所有计时器之后,您立即取消它们.这不能像ExecutorService您可以安排所需的一样,然后调用shutdown- 这实际上取消了计时器和所有计划任务.

您的代码的另一个问题是您立即打电话System.exit,没有任何机会让计划的任务实际运行.

除了这些问题Timer already canceled之外,如果先前的任务引发异常,您可能会遇到异常.在任何地方都不会看到异常,但会取消定时器.确保将计时器任务包装到catch-all tr​​y-statement中.

  • 将任务包装在一个全能块中的要点至关重要.Timer文档引用这个(椭圆形,IMO)说:"如果计时器的任务执行线程意外终止,例如,因为调用了stop方法,任何进一步尝试在计时器上调度任务都将导致IllegalStateException,就像调用了计时器的取消方法一样." 关键位"意外终止"...... (6认同)