[Java]簡單的排程Schedule程式

之前主機一直被強迫斷線,而且設定了自動ADSL重撥都沒作用,應該是程式被強迫關閉了,所以重撥功能也才沒做用,本來想利用Windows排程,定時一直自動重撥ADSL,不過重撥後還要把ICS Bind DNS Server重啟才有作用,所以簡單的規畫了一個程式,可以設定在Windows排程式,開機後執行,而我是設定在ADSL自動撥號及DNS啟動後執行(一個command檔)。

程式功能很簡單,主要在啟動時把需要排程執行的thread class全都載入及執行,而定時的部份在每一個thread class裡,利用sleep來間隔執行,不過這會有執行內容時間上的問題,程式還有很多需要改進的地方,像是讀取外部檔來設定排程、排程中斷等目前都還沒加入,等有空時再慢慢增加。

Java排程程式

測試ADSL是否斷線是利用執行command指令ipconfig /all 來取得default gateway是否存在著ip位置,如果不存在則執行command 來啟動撥號ADSL,並重啟ICS Bind DNS Server,設定時間是30分鐘檢查一次。不過這是我的環境,需要的人可能要修改些地方。

程式碼如下:





原始碼下載

TaskManager 啟動的Main Class

package yku;

import java.io.*;

//Main start
public class TaskManager implements java.lang.Runnable {
    private java.util.List<yku.TaskRunner> taskList;

    // 載入要排程的程式,並設定間隔時間1000 = 1秒
    public TaskManager() {
        taskList = new java.util.ArrayList<yku.TaskRunner>();
        // NetTest implements Task
        taskList.add(new TaskRunner(new NetTest(), 30 * 60000));
        // InputStream xml =
        // this.getClass().getResourceAsStream("/Schudele.xml");

    }

    // 把所有thread class執行
    @Override
    public void run() {
        for (yku.TaskRunner runner : taskList) {
            runner.run();
        }

    }

    public static void main(String args[]) {
        TaskManager manager = new TaskManager();
        manager.run();
    }

}

TaskRunner 定時執行的Thread

package yku;

//定時thread,定時執行class
public class TaskRunner implements java.lang.Runnable {
    org.apache.log4j.Logger logger = org.apache.log4j.LogManager.getLogger(this
            .getClass());
    private boolean doRun;
    private long SleepTime;
    private Task task;

    // 要執行的class,及休眠時間
    public TaskRunner(Task task, long SleepTime) {
        doRun = true;
        this.SleepTime = SleepTime;
        this.task = task;
    }

    @Override
    public void run() {
        logger.info("Start Task :" + task.getClass().getName());
        while (doRun) {
            doRun = this.task.toDo();
            if (doRun) {
                try {
                    Thread.sleep(SleepTime);
                } catch (InterruptedException exception) {
                    // Who is the idiot who stops me?
                }
            }

        }

    }

}

發表迴響