2

次のコードでは、timer2 の代わりに同じ timer1 オブジェクトを再利用して timertask を呼び出すことはできますか?

            Timer timer1 = new Timer();

        timer1.scheduleAtFixedRate(new TimerTask() {
        int counter = 0;
        @Override
        public void run() {
            PriorityQueueHandler.getQueueInstance().addToQueue(passengers.get(counter));
            counter++;
            if(counter == passengers.size()){
                counter = 0;
            }
        }
    }, DELAY, ARRIVAL_INTERVAL);

    PriorityQueueHandler.getQueueInstance().print();

    Timer timer2 = new Timer();

    timer2.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            PriorityQueueHandler.getQueueInstance().print();
        }
    }, DELAY, BOOKING_INTERVAL);
4

2 に答える 2

3

複数のタスクでタイマー インスタンスを再利用できます。タイマーはすべてのタスクを 1 つのシングル スレッド同期で実行することに注意してください。つまり、1 つのタスクが停止すると、同じタイマーでスケジュールされた他のタスクに影響します。つまり、他のタスクは実行されません。

于 2013-08-20T05:44:54.023 に答える
2

はい、それで問題ありません。タスクが順番に実行されていることに満足しているのであれば。ドキュメントから:

各 Timer オブジェクトに対応するのは、タイマーのすべてのタスクを順番に実行するために使用される単一のバックグラウンド スレッドです。タイマー タスクはすぐに完了する必要があります。タイマー タスクの完了に時間がかかりすぎると、タイマーのタスク実行スレッドが「占有」されます。これにより、後続のタスクの実行が遅延する可能性があり、問題のあるタスクが最終的に完了すると、「まとまり」、立て続けに実行される可能性があります。

多くのスケジュールされたタスクがあっても問題ありません。

実装上の注意: このクラスは、同時にスケジュールされた多数のタスクに対応します (数千でも問題ありません)。内部的には、バイナリ ヒープを使用してタスク キューを表すため、タスクをスケジュールするためのコストは O(log n) です。ここで、n は同時にスケジュールされたタスクの数です。

個人的には、おそらく a を使用しScheduledExecutorServiceて、作成されたスレッドとタスク間の同時実行性をより細かく制御できるようにしますが、それは少し別の問題です。

于 2013-08-20T05:42:37.083 に答える