ホームページ  >  記事  >  Java  >  Java スケジュールされたタスクのテストは TimerTask を継承します

Java スケジュールされたタスクのテストは TimerTask を継承します

php是最好的语言
php是最好的语言オリジナル
2018-08-10 15:03:062069ブラウズ

まず、計画したタスクを定期的に実行する機能を持つJavaタイマー(java.util.Timer)を導入します。タイマーの間隔を設定することで、あらかじめ用意されたタスク(java.util.TimerTask)

について例: タスク timer.schedule(TimerTask, 0, 60 * 60 * 1000) を 1 時間ごとに実行します。

schedule() メソッドの最初のパラメータは、実行する必要があるタスクです。このクラスの型は java.util.TimerTask です。2 番目のパラメータは、タスクを実行するまでの待機時間です。ここで、0 は待機がないことを意味します。 3 番目のパラメータは、ミリ秒単位の間隔時間です。

 /**
  * 定时任务测试类
  * @author admin
  *
  */
public class TimerScheduleDemo extends TimerTask { 
	 
	public TimerScheduleDemo() { 
	} 
	 
	@Override 
	public void run() { 
		print();
	} 
	 
	public static void main(String[] args) { 
		Timer timer = new Timer(); 
		long delay1 = 1 * 1000; 
		long period1 = 1000; 
		// 从现在开始 1*1000 秒钟之后,每隔 1 秒钟执行一次 
		timer.schedule(new TimerScheduleDemo(), delay1, period1); 
		/*long delay2 = 2 * 1000; 
		long period2 = 2000; 
		// 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次 
		timer.schedule(new TimerScheduleDemo(), delay2, period2); */
	} 
	
	public static void print(){
		System.out.println("method start");
	}
	
}

しかし:

Web プロジェクトの開始時にタイマーが自動的に計時を開始できるようにして、Web プロジェクトの存続期間を通じてタスクが定期的に実行されるようにしたいので、タイマーを開始するクラスを一般的なクラスにすることはできません。 . クラス。ここではサーブレット リスナー クラスを使用してタイマーを開始します。このリスナーを構成ファイルで構成すると、プロジェクトの開始時に自動的にロードされて実行され、その存続期間は Web プロジェクトのライフ サイクル全体になります。

Taskクラス 主な業務コード

/**
 * 定时器任务类:即调度任务类
 * @author admin
 */
public class DelFileTask extends TimerTask{


    private static boolean isRunning = false;    
    
    private ServletContext context = null;    
    
    public DelFileTask() {  
        super();  
    }  
      
    public DelFileTask(ServletContext context) {    
        this.context = context;    
    }    
    @Override  
    public void run() {  
          
        if (!isRunning) {  
               
            context.log("开始执行指定任务");   
            /** 
             * 自己的业务代码 
             */  
              
            isRunning = false;    
            context.log("指定任务执行结束");  
        } else {    
            context.log("上一次任务执行还未结束");    
       }  
    }  
	 
}

このクラスは主にTimerTaskを継承し、そのrunメソッドを実装します

以下はサーバーの起動をリッスンしてタスクスタックにタスクを追加するリスニングクラスです

/**
 * servlet监听器:监听服务启动时执行调度任务
 * @author admin
 *
 */
public class ContextListener implements ServletContextListener{

	public ContextListener() { 
		
    }  
      
     private java.util.Timer timer = null;    
       
    /** 
     * 初始化定时器 
     * web 程序运行时候自动加载   
     */  
    @Override  
    public void contextInitialized(ServletContextEvent arg0) {  
          
    	/**
    	 * 设置一个定时器  
    	 */
        timer = new java.util.Timer(true);    
            
        arg0.getServletContext().log("定时器已启动");   
    
        /**
         * 定时器到指定的时间时,执行某个操作(如某个类,或方法)  
         */
        //设置执行时间  
        Calendar calendar =Calendar.getInstance();  
        int year = calendar.get(Calendar.YEAR);  
        int month = calendar.get(Calendar.MONTH);  
        int day =calendar.get(Calendar.DAY_OF_MONTH);//每天  
        //定制每天的16:10:00执行,  
        calendar.set(year, month, day, 16, 10, 00);  
        Date date = calendar.getTime();  
        System.out.println(date);  
        
        int period = 1000;  
        //每天的date时刻执行task,每隔persion 时间重复执行  
        timer.schedule(new DelFileTask(arg0.getServletContext()), date, period);
        
        //在 指定的date时刻执行task, 仅执行一次  
        //timer.schedule(new DelFileTask(arg0.getServletContext()), date);  
          
        arg0.getServletContext().log("已经添加任务调度表");    
          
    }  
  
    /** 
     * 销毁 
     */  
    @Override  
    public void contextDestroyed(ServletContextEvent arg0){  
  
        timer.cancel();  
        arg0.getServletContext().log("定时器销毁");  
    }  


}

このクラスは主にスケジューラをセットアップし、特定の要件に従ってタスクを実行させます。

タスクリスナークラスが実装されました。次のステップは、Webでリスナーを設定することです

Javaタイマーの使い方 タイマー-Javaチュートリアル

以上がJava スケジュールされたタスクのテストは TimerTask を継承しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。