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

标签 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 分钟不活动后重置 Web 服务连接。我计划使用 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() 方法,如何将计时器倒计时重置为 0?我知道我可以简单地取消当前的计时器任务并安排一个新的任务,但这似乎很浪费。

我尝试过研究执行器和线程池,但由于某种原因,我无法掌握如何用它们正确实现这个用例。如果有人有一个很好的例子来链接使其发挥作用,我很乐意看一下。从其他一些帖子中我知道,为此建议使用线程池而不是使用 Timer/TimerTask。

最佳答案

我建议您首先采取最安全的解决方案:每次调用get方法时,取消当前的timerTask并实例化一个新的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;
    }
}

顺便说一句:我还建议您同步webervice 的每次访问,以避免在多线程环境中出现运行状况。因此,必须将其声明为私有(private):

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;
    }
}

关于java - 方法调用后将任务计时器重置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374851/

相关文章:

Java 可选获取如果存在

java - 无法在 Windows 7 32 位控制面板中设置 JRE 参数

java - 有没有一种方法可以在java中执行一段代码而不将其放入静态main方法中

swift - 如何在后台线程上每秒执行一个方法,这样它就不会影响应用程序的性能

java - 在扩展小程序的类中哪里创建 Swing Timer

android - 重新加载 Webview 用户定义的计时器字符串

python - 如何在Python中的特定时间间隔后运行一个方法?

java - 仅使用扫描仪读取应用程序中的txt文件

Java 程序在 raspberry pi 上短时间后无错误地卡住

java - Swing 定时器编译错误