1. FileWatchdog 抽象类,它的子类在初始化时会调用checkAndConfigure方法,此方法记录文件最后修改时间并执行doOnChange方法读取文件。
2. FileWatchdog 又继承Thread,所以在线程启动后,每隔一段时间重新读取配置文件.
理解此原理继承、多态一定掌握哦
public abstractclass FileWatchdogextends Thread
{
/**
* The default delay between every file modification check, set to 60
* seconds.
*/
static final public long DEFAULT_DELAY = 60000;
/**
* The name of the file to observe for changes.
*/
protected String filename;
/**
* The delay to observe between every check. By default set
* {@link #DEFAULT_DELAY}.
*/
protected long delay = DEFAULT_DELAY;
File file;
long lastModif = 0;
boolean warnedAlready = false;
boolean interrupted = false;
protected FileWatchdog(String filename)
{
super("FileWatchdog");
this.filename = filename;
file = new File(filename);
setDaemon(true);
checkAndConfigure();
}
/**
* Set the delay to observe between each check of the file changes.
*/
public void setDelay(long delay)
{
this.delay = delay;
}
abstract protected void doOnChange();
protected void checkAndConfigure()
{
boolean fileExists;
try
{
fileExists = file.exists();
}
catch (SecurityException e)
{
LogLog.warn("Was not allowed to read check file existance, file:[" + filename + "].");
interrupted = true; // there is no point in continuing
return;
}
if (fileExists)
{
long l = file.lastModified(); // this can also throw a
// SecurityException
if (l > lastModif)
{
// however, if we reached this point this
lastModif = l; // is very unlikely.
doOnChange();
warnedAlready = false;
}
}
else
{
if (!warnedAlready)
{
LogLog.debug("[" + filename + "] does not exist.");
warnedAlready = true;
}
}
}
public void run()
{
while (!interrupted)
{
try
{
Thread.sleep(delay);
}
catch (InterruptedException e)
{
// no interruption expected
}
checkAndConfigure();
}
}
}
关注【Java技术堂】