web-dev-qa-db-ja.com

タイマー入力Javaスレッド

いくつかのプロセスを担当するスレッドがあります。これらの処理が3秒ごとに行われるようにします。以下のコードを使用しましたが、スレッドが開始しても何も起こりません。タイマーのタスクを定義すると、時間間隔内でScheduledTaskが自動的に実行されると仮定しましたが、何もしません。私は何が欠けていますか?

class temperatureUp extends Thread 
{
    @Override
    public void run()
    {
    TimerTask increaseTemperature = new TimerTask(){

        public void run() {
        try {
            //do the processing 
        } catch (InterruptedException ex) {}
        }
    };

    Timer increaserTimer = new Timer("MyTimer");
    increaserTimer.schedule(increaseTemperature, 3000);

    }
};
18
Afflatus

コードスニペットのいくつかのエラー:

  • Threadクラスを拡張しますが、これはあまり良い方法ではありません
  • Timer内にThreadがありますか? Timerが独自のThreadで実行されるため、これは意味がありません。

むしろ(必要な場合/必要な場合)Runnableを実装する必要があります here を参照してください。ただし、スニペットでThreadTimerの両方の必要性を確認することはできません。

以下のTimerの動作例を参照してください。これは、呼び出されるたびに(3秒ごとに)1ずつカウンタをインクリメントします。

import Java.util.Timer;
import Java.util.TimerTask;

public class Test {

    static int counter = 0;

    public static void main(String[] args) {

        TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                System.out.println("TimerTask executing counter is: " + counter);
                counter++;//increments the counter
            }
        };

        Timer timer = new Timer("MyTimer");//create a new Timer

        timer.scheduleAtFixedRate(timerTask, 30, 3000);//this line starts the timer at the same time its executed
    }
}

補遺:

Threadをミックスに組み込む簡単な例を行いました。したがって、TimerTaskは3秒ごとにcounterを1ずつインクリメントするだけで、Threadはカウンターをチェックするたびに1秒間スリープするcounters値を表示します(counter==3の後に自分自身とタイマーを終了します):

import Java.util.Timer;
import Java.util.TimerTask;

public class Test {

    static int counter = 0;
    static Timer timer;

    public static void main(String[] args) {

        //create timer task to increment counter
        TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                // System.out.println("TimerTask executing counter is: " + counter);
                counter++;
            }
        };

        //create thread to print counter value
        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    try {
                        System.out.println("Thread reading counter is: " + counter);
                        if (counter == 3) {
                            System.out.println("Counter has reached 3 now will terminate");
                            timer.cancel();//end the timer
                            break;//end this loop
                        }
                        Thread.sleep(1000);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });

        timer = new Timer("MyTimer");//create a new timer
        timer.scheduleAtFixedRate(timerTask, 30, 3000);//start timer in 30ms to increment  counter

        t.start();//start thread to display counter
    }
}
21
David Kroukamp
import Java.util.Timer;
import Java.util.TimerTask;

public class ThreadTimer extends TimerTask{
    static int counter = 0;

    public static void main(String [] args) {
        Timer timer = new Timer("MyTimer");
        timer.scheduleAtFixedRate(new ThreadTimer(), 30, 3000);
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("TimerTask executing counter is: " + counter);
        counter++;
   }

}
4
Nay

3秒ごとに何かを行うには、scheduleAtFixedRateを使用する必要があります( javadoc を参照)。

ただし、スレッドの実行が停止する直前にタイマーを開始するスレッドを作成するため、コードは実際には何もしません(これ以上行うことはありません)。タイマー(シングルシュートタイマー)がトリガーされると、中断するスレッドはありません(前に終了して実行されます)。

class temperatureUp extends Thread 
{
    @Override
    public void run()
    {
    TimerTask increaseTemperature = new TimerTask(){

        public void run() {
        try {
            //do the processing 
        } catch (InterruptedException ex) {}
        }
    };

    Timer increaserTimer = new Timer("MyTimer");
    //start a 3 seconds timer 10ms later
    increaserTimer.scheduleAtFixedRate(increaseTemperature, 3000, 10);

    while(true) {
         //give it some time to see timer triggering
         doSomethingMeaningful();
    }
}
2
Daniel Voina

あなたが使用したメソッドには署名schedule(TimerTask task, long delay)があると思います。したがって、実際には、実行のみの開始時間を遅らせているだけです。

3秒ごとに実行するようにスケジュールするには、thirdparamを使用して期間間隔を指定するこのメソッドschedule(TimerTask task, long delay, long period)を使用する必要があります。

ここでタイマークラスの定義を参照して、さらにヘルプを参照できます。

http://docs.Oracle.com/javase/1.4.2/docs/api/Java/util/Timer.html

1
afrin216