Javaステップアップ(18)Java実装タイマ(Timer)
Javaインプリメンテーションタイマ(Timer)
緒
アプリケーション開発では、5分ごとに操作を実行するなど、周期的な操作が必要になることが多い.このような操作に最も便利で効率的な実現方法はjava.util.Timerツールクラスを使用することです.JAva.utilこのパッケージには、TimerとTimerTaskの2つのクラスがあります.TimerはObjectから直接継承され、タイマに相当し、ある時間を指定してタスクを実行したり、一定の時間間隔で同じタスクを繰り返したりすることができます.Timerを作成すると、タスクの実行を制御するスレッドが生成されます.TimerTaskは、Runnableインタフェースを実装するタスクを実装するクラスであり、スレッドに相当します.
手順:
ステップ1:テストクラス、extendsの作成 TimerTask,再run()メソッド,runメソッドには実行する論理コードが含まれています.例は次のとおりです.
ステップ2:ServertContextListenerインタフェースを実装するクラスを作成します.
ステップ3:web.xmlに次のコードにTimerTaskManagerのパスを記入します.プログラムはwebコンテナが起動すると、TimerTaskManagerをロードするcontextInitializedメソッドを初期化します.
Listenerの追加方法:
listenerラベルを付け、listenerにlistener-classラベルを付け、listener-classラベルにはTimerTaskManagerのパスが含まれています.たとえば、com.TimerTaskManager.
例:
関連注意点分析:
1、タスクスケジューリングはリアルタイム保証を優先する
Javaの天性のため、しかもJDKを開発する過程の中で異なるプラットフォームを考慮しなければならなくて、異なるプラットフォームのスレッドのスケジューリングのメカニズムは異なって、そのため各種のプラットフォームの下でJVM のスレッドスケジューリングメカニズムも一致しません.これにより、Timerは、指定された時間内にタスクを実行することを保証できません.また、TimerTaskはRunnableインタフェースを実装するため、TimerTaskがスレッドキューに入れられてしばらくスリープした後、指定されたこのTimerTaskが呼び出されると、実行の正確なタイミングはJVMのスケジューリングポリシーと現在CPU処理を待っているスレッドがどれだけあるかに依存する.したがって、タスクが指定された時間内に実行されることは保証されません.通常、タスクの実行が遅延するのは、次の2つの場合です.
(1)実行待ちのスレッドが多数存在する
(2)GCメカニズムの影響による遅延
これもなぜTimerで APIに2つのスケジューリング方法が存在する理由.次のようになります.
(1)schedule()
固定遅延でスケジューリングする.このメソッドを使用すると、タスク実行の各遅延が後続のタスクの実行に伝播します.
(2)、scheduleAsFixedRate()
固定比率でスケジューリングする.本方法を使用する場合、後続のすべての実行は、初期実行時間に従ってスケジューリングされ、遅延を低減することが望ましい.
具体的にどの方法を使用するかは、プログラムやシステムにとってどのパラメータがより重要かによって異なります.
2.各Timerオブジェクトはバックグラウンドでスレッドを起動します.この性質は、アプリケーションサーバなどの管理環境では推奨されません.これらのスレッドはコンテナの制御範囲内ではないからです.
緒
アプリケーション開発では、5分ごとに操作を実行するなど、周期的な操作が必要になることが多い.このような操作に最も便利で効率的な実現方法はjava.util.Timerツールクラスを使用することです.JAva.utilこのパッケージには、TimerとTimerTaskの2つのクラスがあります.TimerはObjectから直接継承され、タイマに相当し、ある時間を指定してタスクを実行したり、一定の時間間隔で同じタスクを繰り返したりすることができます.Timerを作成すると、タスクの実行を制御するスレッドが生成されます.TimerTaskは、Runnableインタフェースを実装するタスクを実装するクラスであり、スレッドに相当します.
手順:
ステップ1:テストクラス、extendsの作成 TimerTask,再run()メソッド,runメソッドには実行する論理コードが含まれています.例は次のとおりです.
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
public class MyTest1 extends TimerTask {
private SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
@Override
public void run() {
System.out.println(" :"+sf.format(new Date()));
}
}
ステップ2:ServertContextListenerインタフェースを実装するクラスを作成します.
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TimerTaskManager implements ServletContextListener {
private Timer timer;
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println(" .....................................");
MyTest1 t=new MyTest1();
timer=new Timer(" ",true);
/* MyTest1 run ,t TimerTask ,0 0 run * ,1000 run ,
*/
timer.schedule(t, 0, 1000);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println(" .....................................");
timer.cancel();
}
}
ステップ3:web.xmlに次のコードにTimerTaskManagerのパスを記入します.プログラムはwebコンテナが起動すると、TimerTaskManagerをロードするcontextInitializedメソッドを初期化します.
Listenerの追加方法:
listenerラベルを付け、listenerにlistener-classラベルを付け、listener-classラベルにはTimerTaskManagerのパスが含まれています.たとえば、com.TimerTaskManager.
例:
weiming.lmapp.timer.SysContextListener
関連注意点分析:
1、タスクスケジューリングはリアルタイム保証を優先する
Javaの天性のため、しかもJDKを開発する過程の中で異なるプラットフォームを考慮しなければならなくて、異なるプラットフォームのスレッドのスケジューリングのメカニズムは異なって、そのため各種のプラットフォームの下でJVM のスレッドスケジューリングメカニズムも一致しません.これにより、Timerは、指定された時間内にタスクを実行することを保証できません.また、TimerTaskはRunnableインタフェースを実装するため、TimerTaskがスレッドキューに入れられてしばらくスリープした後、指定されたこのTimerTaskが呼び出されると、実行の正確なタイミングはJVMのスケジューリングポリシーと現在CPU処理を待っているスレッドがどれだけあるかに依存する.したがって、タスクが指定された時間内に実行されることは保証されません.通常、タスクの実行が遅延するのは、次の2つの場合です.
(1)実行待ちのスレッドが多数存在する
(2)GCメカニズムの影響による遅延
これもなぜTimerで APIに2つのスケジューリング方法が存在する理由.次のようになります.
(1)schedule()
固定遅延でスケジューリングする.このメソッドを使用すると、タスク実行の各遅延が後続のタスクの実行に伝播します.
(2)、scheduleAsFixedRate()
固定比率でスケジューリングする.本方法を使用する場合、後続のすべての実行は、初期実行時間に従ってスケジューリングされ、遅延を低減することが望ましい.
具体的にどの方法を使用するかは、プログラムやシステムにとってどのパラメータがより重要かによって異なります.
2.各Timerオブジェクトはバックグラウンドでスレッドを起動します.この性質は、アプリケーションサーバなどの管理環境では推奨されません.これらのスレッドはコンテナの制御範囲内ではないからです.