2009年06月27日

【1日1Java】簡易スケジューラ(5秒置きに処理実行)

import java.util.Date;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

public class Test {

    public static void main(String[] args) throws Exception {
        // JRE 1.6.0_07
        // java.util.Timer
        // java.util.TimerTask
        // 定期的(本例では5秒ごと)に処理を実行する

        Timer timer = new Timer( "hoge" );

        // 3秒後に1度目のタスクを実行し、その後は5秒置きに実行する
        timer.scheduleAtFixedRate(new TestTimerTask(), 3 * 1000, 5 * 1000);
        
        // 30秒待って、処理を終了する
        Thread.sleep(10 * 3000);
        timer.cancel();
        
        // JavaDoc
        // http://java.sun.com/javase/ja/6/docs/ja/api/
        // 上記のような「固定頻度実行」だけでなく、処理終了後から指定秒後に再度
        // 処理を実行するような「固定遅延実行」も可能
        
        
        // 指定したname(hoge)はそのままスレッドの名前として設定される
        // こんな阿呆な消し方も可能と言えば可能(Thread.stopはduplicated)
        // Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
        // for( Thread thread : map.keySet() ) {
        //     if( "hoge".equals( thread.getName() ) ) {
        //         thread.stop();
        //     }
        // }
    }
}

class TestTimerTask extends TimerTask {
    public void run() {
        System.out.println(new Date());
    }
}