いくつかのプロセスを担当するスレッドがあります。これらの処理が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);
}
};
コードスニペットのいくつかのエラー:
Thread
クラスを拡張しますが、これはあまり良い方法ではありませんTimer
内にThread
がありますか? Timer
が独自のThread
で実行されるため、これは意味がありません。むしろ(必要な場合/必要な場合)Runnable
を実装する必要があります here を参照してください。ただし、スニペットでThread
とTimer
の両方の必要性を確認することはできません。
以下の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秒間スリープするcounter
s値を表示します(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
}
}
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++;
}
}
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();
}
}
あなたが使用したメソッドには署名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