ホームページ  >  記事  >  Java  >  タイマーとタイマータスク Java でのタイマーとスケジュールされたタスクの使用例

タイマーとタイマータスク Java でのタイマーとスケジュールされたタスクの使用例

高洛峰
高洛峰オリジナル
2016-12-16 13:06:381284ブラウズ

これら 2 つのクラスは非常に使いやすく、タイマーのほとんどのニーズを満たすことができます。
Timer クラスは、タスクを実行するための 2 つのモードをパラメータとして受け取ります。最も一般的に使用されるのはスケジュールです。これは 2 つの方法でタスクを実行できます: 1: 特定の時間 (データ)、2: 一定時間後 (int 遅延) どちらの方法でもタスクの実行頻度を指定できます。 Java

package com.cn;  
import java.io.IOException;  
import java.util.Timer;  
    
public class TimerTest{     
           
    public static void main(String[] args){     
        Timer timer = new Timer();     
        timer.schedule(new MyTask(), 1000, 2000);//在1秒后执行此任务,每次间隔2秒执行一次,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.     
        while(true){//这个是用来停止此任务的,否则就一直循环执行此任务     
            try{     
                int in = System.in.read();    
                if(in == 's'){     
                    timer.cancel();//使用这个方法退出任务     
                    break;  
                }     
            } catch (IOException e){     
                // TODO Auto-generated catch block     
                e.printStackTrace();     
            }     
        }     
    }    
      
    static class MyTask extends java.util.TimerTask{      
        public void run(){     
            System.out.println("________");     
        }     
    }    
}

このタイプのランタイム:

プログラムの開始から 1 秒後にコンソールに「————」を出力します

2 秒の間隔の後、MyTask の run() メソッドを実行し、「————」を出力します—" —"

これはループし続けます

コンソールにs文字が入力されると、タイマーは作業をキャンセルします

ループ全体から飛び出します

プログラムは終了します!

TimerTest2.java:

package com.cn;  
  
import java.io.IOException;  
import java.util.Date;  
import java.util.Timer;  
  
public class TimerTest2{     
        
    public static void main(String[] args){     
        Timer timer = new Timer();     
        MyTask myTask1 = new MyTask();     
        MyTask myTask2 = new MyTask();     
        myTask2.setInfo("myTask-info-2");     
          
        timer.schedule(myTask1, 1000, 2000);  //任务1 一秒钟后执行,每两秒执行一次。   
        timer.scheduleAtFixedRate(myTask2, 2000, 3000);   //任务2 2秒后开始进行重复的固定速率执行(3秒钟重复一次)  
          
        while (true){     
            try{     
                //用来接收键盘输入的字符串  
                byte[] info = new byte[1024];     
                int len = System.in.read(info);    
                  
                String strInfo = new String(info, 0, len, "GBK");//从控制台读出信息     
                  
                if (strInfo.charAt(strInfo.length() - 1) == ' '){     
                    strInfo = strInfo.substring(0, strInfo.length() - 2);     
                }    
                  
                if (strInfo.startsWith("Cancel-1")){     
                    myTask1.cancel();//退出任务1     
                    // 其实应该在这里判断myTask2是否也退出了,是的话就应该break.但是因为无法在包外得到     
                    // myTask2的状态,所以,这里不能做出是否退出循环的判断.     
                } else if (strInfo.startsWith("Cancel-2")){     
                    myTask2.cancel();  //退出任务2   
                } else if (strInfo.startsWith("Cancel-All")){     
                    timer.cancel();//退出Timer     
                    break;     
                } else{     
                    // 只对myTask1作出判断,偷个懒^_^     
                    myTask1.setInfo(strInfo);     
                }     
            } catch (IOException e){     
                // TODO Auto-generated catch block     
                e.printStackTrace();     
            }     
        }     
    }     
    
    static class MyTask extends java.util.TimerTask{     
          
        String info = "INFO";  
    
        @Override     
        public void run(){     
            // TODO Auto-generated method stub     
            System.out.println(new Date() + "      " + info);     
        }     
    
        public String getInfo(){     
            return info;     
        }     
        public void setInfo(String info){     
            this.info = info;     
        }     
    }     
      
}

このクラスは、2 つのスケジュールされたタスク mytask1 と mytask2 を作成します

mytask1 タスクは、上記の TimerTest クラスの例と同じように使用されます。つまり、指定されたタスクは、指定された遅延から開始して一定の遅延を繰り返して実行されるようにスケジュールされます。

mytask2タスクは上記の使い方とは異なり、タイマーのscheduleAtFixedRate()メソッドを使用して実行されます。

scheduleAtFixedRate() メソッドは、API 1.6.0 で次のように定義されています。

指定されたタスクを、指定された時刻に開始して繰り返し固定レートで実行するようにスケジュールします。後続の実行は、指定された期間で区切られ、ほぼ一定の間隔で行われます。


ほぼ一定の時間間隔とは、固定レート実行では、各実行がスケジュールされた初回実行時間に相対してスケジュールされることを意味します。何らかの理由 (ガベージ コレクションやその他のバックグラウンド アクティビティなど) で実行が遅延した場合、2 つ以上の実行が立て続けに発生し、後続の実行が追いつくことができます。



Timer クラスのその他の一般的に使用されるメソッド:

cancel()
このタイマーを終了し、現在スケジュールされているすべてのタスクを破棄します。

purge()

このタイマーのタスクキューからキャンセルされたタスクをすべて削除します。

schedule(TimerTask task, Date time)

指定された時刻に指定されたタスクの実行をスケジュールします。



TimerTask クラスのその他の一般的に使用されるメソッド:

cancel()
このタイマー タスクをキャンセルします。

run()

このタイマータスクによって実行される操作。

scheduledExecutionTime()

このタスクの最新の実際の実行のスケジュールされた実行時間を返します。


Java での Timer と TimerTask の使用例については、PHP 中国語 Web サイトに注目してください。


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