0

ブール値を使用して int 値にリンクされているタイマーを開始および停止するクラスで単一の関数を使用しようとしています。たとえば、int が 0 のタイマーを開始した場合、それは timer0 になり、3 の場合は timer3 などになります。

私が抱えている問題は、タイマーが正常に開始されているように見えることですが、タイマーを停止するために偽のブール値を送信すると、タイマーが実行され続けるため、タイマーを正しく停止する方法を知る必要があります。

Class.java のコードは次のとおりです。

public void Event(final int value, boolean run, int time){

    if(run){
        System.out.println(run);

        Timer timer = new Timer();

        timer.schedule( new TimerTask() {
            public void run() {
                // The needed code will go here
                System.out.println(value + " Event run");
            }
         }, 0, time); // Every second
    } else {
    }

} 

次に、私の Main.java のコードは次のとおりです。

System.out.println("Start Timer 0 Event");
r.Event(0, true, 1000);

System.out.println("Start Timer 1 Event");
r.Event(1, true, 250);

System.out.println("Start Timer 2 Event");
r.Event(2, true, 250);

r.Event(0, false, 1000); // Not Working as i need
System.out.println("Stop Timer 0 Event");

基本的に、イベントのセットを停止するまで、設定した時間ごとに一連のイベントを繰り返してもらいたいだけで、多くのイベントが一緒に実行される可能性があります。タイマーがこれを行う最良の方法でない場合は、別の方法で問題ありませんが、説明したのと同じ方法で動作する必要があります。


リクエストに応じて、タイマーの実行可能なコードをここに示します。

MyClass.java:

package com.z;

import java.awt.*;
import java.util.*;
import java.util.TimerTask;

public class MyClass {

////////////////////////////////////////////////////////////
//Name: Event (BROKEN)
////////////////////////////////////////////////////////////
public void Event(final int value, boolean run, int time){

    Timer timer = new Timer("" + value, true);

    if(run){
        System.out.println(run);

        timer.schedule( new TimerTask() {
            public void run() {
                // Code here
                System.out.println(value + " Event run");
            }
         }, 0, time); // Every second
    } 

    if (!run) {
        timer.cancel();
    }
}

}

例.java:

package com.z;

import java.awt.*;
import java.awt.event.*;

public class Example {

    public static void main(String[] args) {

    MyClass r = new MyClass();

    ////////////////////////////////////////////////////////////
    // Event (BROKEN)
    ////////////////////////////////////////////////////////////
    System.out.println("Start Timer 0 Event");
    r.Event(0, true, 1000);

    System.out.println("Start Timer 1 Event");
    r.Event(1, true, 250);

    r.Event(0, false, 1000);
    System.out.println("Stop Timer 0 Event");

    }
}
4

3 に答える 3

1

3 つのtimer.schedule引数を取るメソッドは実行を繰り返すため、run が true の場合、タイマーはタスクの実行を開始します。

タイマーを停止したい場合は、いつでも を呼び出すことができますが、タイマーへの参照をメソッドtimer.cancelの外に保存する必要があります。Event

Timerjavadocs を読むと、ここで役立つはずですhttp://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

編集:これがどのように機能するかの例です

Timer startTimer(final int value, final long time) {
   Timer timer = new Timer("Timer" + value);
   timer.schedule( new TimerTask() {
            public void run() {
                // Code here
                System.out.println(value + " Event run");
            }
         }, 0, time); // Every second
   return timer;
}

Timer t0 = startTimer(0,1000);
Timer t1 = startTimer(1,1000);

// stop t0
t0.cancel();
于 2012-08-02T11:46:01.893 に答える
1

別の解決策は、各タイマーが単一のスレッドであり、その実行がリソースを消費するため、代わりにタイマーを使用することです。タスク キューをチェックするスレッドを 1 つ作成できます。タスクは、期間パラメーターを使用してスケジュールできます。スケジューリングとは、タスクをキューに追加することを意味します。また、メインスレッドは、各タスクがその期間値に対応するキューで十分に長く待機しているかどうかを確認します。

 while (running) {
     Timer timer = timerQueue.poll();
     if (timer.nextExecutionTime < System.currentTimeMillis()) {
        timer.timerExpire();
     }
     else {
        // nextexecution time degismeden yeniden schedule edilir.
        reschedule(timer);
     }
  }// while

この例では、Timer は TimerListener を保持する独自のクラスです。タイマー タスクの操作を開始するときは、timerExpire メソッド内に記述します。

于 2012-08-02T11:57:25.747 に答える
0

タイマーは、スケジュールされてから 5 秒後に実行され、timer.cancel が呼び出されるまで 1 秒ごとに実行され続けます。

    Timer timer = new Timer();

    timer.schedule(new TimerTask(){

        @Override
        public void run() {
            System.out.println("Timer task");

        }

    }, 5000,1000);
于 2012-08-02T11:51:53.247 に答える