java中使用线程实现Timer(定时器)原理和源码

    技术2022-05-11  7

    下载源码和示例

    1 原理:启动一个线程来刷时间,缺点是不太精确,可能跟线程的优先级有关系。

    会有0-10ms的误差。精确到0.1s是没有问题的。

     

    package  timer; public   class  Timer  {    private long interval;    // private boolean enabled;    private Task task;    private Clock clock;    public Timer(long _interval, Task _task) {        super();        this.interval = _interval;        // this.enabled = enabled;        this.task = _task;        clock = new Clock();        clock.start();        new Thread(new Runnable() {            public void run() {                boolean b = true;                                while (b) {                                        //System.out.println(clock.getCurrTime());                                        if (interval <= clock.getCurrTime()) {                                                System.out.println(clock.getCurrTime());                                                task.doit();                        clock.setCurrTime(0);                                                //clock.stop();                                                //System.out.println(clock.getCurrTime());                                                //b = false;                    }                }            }        }).start();    }    public Task getTask() {        return task;    }    public long getInterval() {        return interval;    }    // public boolean isEnabled() {    // return enabled;    // }    // public void setEnabled(boolean enabled) {    // this.enabled = enabled;    // }}

     

    package  timer; public   class  Clock  extends  Thread  {    private long oldTime;    private long currTime;    public Clock() {        oldTime = System.currentTimeMillis();        currTime = 0;    }    public long getCurrTime() {        return currTime;    }    @Override    public void run() {        while (true{            currTime = System.currentTimeMillis() - oldTime;        }    }    public void setCurrTime(long currTime) {        this.currTime = currTime;    }}

     

    package  timer; public   interface  Task  {    void doit();}

     

    package  timer; public   class  NewTask  implements  Task  {    public void doit() {        System.out.println( System.currentTimeMillis() );    }}

     

    package  timer; public   class  Test  {    /**     * @param args     */    public static void main(String[] args) {        Task task = new NewTask();        Timer t = new Timer(1000,task);        }}

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1660778


    最新回复(0)