Java计时器使每一分钟运行一个函数

时间:2014-05-03 13:35:01

标签: java multithreading timer

我有一个应用程序,我需要每分钟访问一次Web服务。我打算使用一个线程,但如果用户输入任何内容,那么'计时器'需要延迟。我不太清楚如何在java中实现它

2 个答案:

答案 0 :(得分:0)

看一下wait()的these examples和programcreek.com的notify(),你知道wait和notify的概念吗?

答案 1 :(得分:0)

我个人就是如何处理它: 我声明了两个类,它们将在每个给定的毫秒后为您提供函数调用的功能。

在新界面中:

 public interface TickListener {
        public void tick();
        public void tick(Exception e);
    }

在另一个班级

public class TickManager {

    public static final int STATE_TICK_ONCE = 0;
    public static final int STATE_TICK_NONSTOP = 1;
    public static final int STATE_TICK_NONE = 2;

    int state, delay;
    Thread t;
    TickListener[] listeners;
    long tickCount;

    public TickManager(){
        this(TickManager.STATE_TICK_NONE);
    }
    public TickManager(int state){
        this(state,1000);
    }
    public TickManager(int state, int d){
        this(state,d,null);
    }
    public TickManager(int state, int d, TickListener[] t){
        this.state = state;
        delay = d;
        listeners = t;
        tickCount=0;
        if(state!=2){
            startTicking(state);
        }
    }

    public void startTicking(int s){
        tickCount = 0;
        state=s;
        t = new Thread(new Runnable() {

            @Override
            public void run() {
                while (state!=TickManager.STATE_TICK_NONE) {
                    tickCount++;
                    try {
                        Thread.sleep(delay);
                    } catch (Exception e) {
                        process(e);
                        stopTicking();
                    }
                    process();
                    if (state == TickManager.STATE_TICK_ONCE && tickCount == 1) {
                        stopTicking();
                    }
                }
            }
        });
        t.start();
    }
    public void process(){
        if(listeners!=null){
            for(TickListener l : listeners){
                l.tick();
            }
        }
    }
    public void process(Exception e){
        if(listeners!=null){
            for(TickListener l : listeners){
                l.tick(e);
            }
        }
    }
    public void stopTicking(){
        state = TickManager.STATE_TICK_NONE;
        t=null;
    }

    public int getState() {
        return state;
    }
    public int getDelay() {
        return delay;
    }
    public Thread getThread() {
        return t;
    }
    public TickListener[] getListeners() {
        return listeners;
    }
    public long getTickCount() {
        return tickCount;
    }

    public void setState(int state) {
        this.state = state;
    }
    public void setTickCount(long tickCount) {
        this.tickCount = tickCount;
    }
    public void setDelay(int delay) {
        this.delay = delay;
    }

    public void addTickListener(TickListener t){
        if(listeners!=null){
            int l = listeners.length;
            TickListener[] tl = new TickListener[l+1];
            System.arraycopy(listeners, 0, tl, 0, l);
            tl[l] = t;
            listeners=tl;
        }
        else{
            listeners=new TickListener[1];
            listeners[0]=t;
        }
    }
}

您所要做的就是创建TickManager的对象,在其中注册TickListener并在其上调用startTicking()。延迟也是通过构造函数设置的。

确保在滴答声时不要更改延迟时间。可以通过调用getState()函数并将其与类常量进行比较来检查它。如果是,则必须将其停止,更改延迟并再次启动。