【发布时间】:2015-12-19 20:04:43
【问题描述】:
这是我尝试查找但找不到与我正在尝试做的事情足够相似的情况。
我有一个类是 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() 方法,如何将 Timer 倒计时重置为 0?我知道我可以简单地取消当前的计时器任务并安排一个新的,但这似乎很浪费。
我尝试过研究执行器和线程池,但由于某种原因,我无法掌握如何正确地使用这些实现这个用例。如果有人有一个很好的例子来链接让它工作,我很乐意看看它。从其他一些帖子中,我知道建议使用线程池而不是为此使用 Timer/TimerTask。
【问题讨论】:
-
我认为你需要重新设计它,所以'ConnectionManager'类将负责将'webservice'实例设置为null,否则在调用'getWebservice'方法时可能会得到null。
-
@Victor Bouhnik 不会在类上同步然后验证变量是否为空就足以防止空返回?我认为这类似于其他人如何为单例类调用 getInstance() 的示例。