Javaステップアップ(18)Java実装タイマ(Timer)

2844 ワード

Javaインプリメンテーションタイマ(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オブジェクトはバックグラウンドでスレッドを起動します.この性質は、アプリケーションサーバなどの管理環境では推奨されません.これらのスレッドはコンテナの制御範囲内ではないからです.