方法调用后将任务计时器重置为0

时间:2015-12-19 20:04:43

标签: java timer

这是我尝试查找的内容,但无法找到与我想要的相似的情况。

我有一个类是Web服务连接的连接管理器,就像这样,(为了演示目的而简化)

public class ConnectionManager {

    Webservice webservice = null;

    public Webservice getWebservice() {
        if(webservice == null) {
           synchronize(ConnectionManager.class) {
              if(webservice == null) {
                 webService = new Webservice();
              }
           }
        }
        return webservice;
    }
}

我想在30分钟不活动后添加一个重置webservice连接的进程。我计划使用Timer和TimerTask执行此操作,因为我只需要1个进程来重置Web服务。

private class ResetServiceTimerTask extends TimerTask {
    @Override
    public void run() {
        webservice = null;
        logger.warn("resetting the web service connections");
    }
}

然后初始化它看起来像这样:

private Timer timer;

public ConnectionManager() {
    timer = new Timer(true);
    timer.schedule(new ResetServiceTimerTask(), 1800000);
}

我的问题是,如果调用get()方法,如何将Timer倒计时重置为0?我知道我可以简单地取消当前的计时器任务并安排一个新任务,但这似乎很浪费。

我已经尝试过查看执行程序和线程池,但由于某种原因,我无法掌握如何正确实现这些用例。如果有人有一个很好的例子来说明如何将其付诸实践,我很乐意看看它。从其他一些帖子中我知道,建议使用线程池而不是使用Timer / TimerTask。

1 个答案:

答案 0 :(得分:1)

我建议你首先采用最安全的解决方案:每次调用 get 方法时,取消当前的timerTask并使用新的超时实例换一个新的。

然后,您可以优化以保存TimerTasks:例如,如果下一次超时小于一分钟(或您决定的最小失效),则可以避免创建新的TimerTask。前一个。我注意到你的超时是半小时(1800000毫秒)。那么,显然,预算不是问题。

可以这样:

private static final int MINIMUM_TIME_LAPSE=60000; // 1 min

private static final int TIMEOUT=1800000; // 30 min

private long previousTime;

private TimerTask timerTask;

private synchronized void scheduleTimeoutIfNecessary()
{
    long currentTime=System.currentTimeMillis();
    if (currentTime-this.previousTime >= MINIMUM_TIME_LAPSE)
    {
        if (this.timerTask!=null)
        {
            this.timerTask.cancel();
        }
        this.timerTask=new ResetServiceTimerTask());
        timer.schedule(this.timerTask, TIMEOUT);
        this.previousTime=currentTime;
    }
}

BTW:我还建议你同步每次访问webervice,以避免多线程环境中的运行条件。因此,必须将其声明为私有:

public class ConnectionManager {

    private Webservice webservice = null;

    public void reset() {
        synchronize(ConnectionManager.class) {
            webService = null;
        }
    }

    public Webservice getWebservice() {
        synchronize(ConnectionManager.class) {
            if(webservice == null) {
               webService = new Webservice();
            }
        }
        return webservice;
    }
}