web-dev-qa-db-ja.com

タイマーはすでにキャンセルされています

FIFOキューからの入力(エンキュー)と出力(デキュー)を管理するための2つのタイマーがありますが、Java.lang.IllegalStateExceptionのデキューの例外が発生し続けます:タイマーはすでにキャンセルされています。Iエラーが発生したと主張されている行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);

        }
    }
}
14
Vhas

すべてのタイマーをスケジュールした直後に、それらをキャンセルします。これは、必要なすべてをスケジュールしてからExecutorServiceを呼び出すことができるshutdownのようには機能しません。これにより、タイマーとスケジュールされたすべてのタスクが実際にキャンセルされます。

コードのもう1つの問題は、すぐにSystem.exitを呼び出し、スケジュールされたタスクを実際に実行する機会を与えないことです。

これらの問題とは別に、前のタスクが例外をスローした場合、Timer already canceled例外が発生する可能性があります。例外はどこにも見られませんが、タイマーはキャンセルされます。タイマータスクをキャッチオールトライステートメントにラップするようにしてください。

10
Marko Topolnik