本文我们将分析懒汉式单例模式的写法
- 定义一个实例变量
static FilterFileManager INSTANCE;
- 私有的无参构造函数
private FilterFileManager() {
this.bRunning = true;
}
- 提供一个公共方法,让外部类可以获取实例
public static FilterFileManager getInstance() {
return INSTANCE;
}
与饿汉式的区别是,懒汉式对实例的初始化,是在init()公共方法调用的时候,如果实例不为null, 才进行初始化实例。
if (INSTANCE == null) {
INSTANCE = new FilterFileManager();
}
- init()方法的入参directories,使用了可变长度参数,写法比较优雅,可以直接赋值给String数组(String[] aDirectories)
- shutdown() 方法是把线程工作的标识设置为false,让线程停止工作。
该类的核心实现是创建一个线程(Thread poller),每个固定时间进行某个动作(manageFiles()),直至bRunning标识为false。而它在实例初始化的时候便已被赋值为true了,也就是说,那时候就可以工作了。
线程在启动的时候,一般会设置为this.poller.setDaemon(true);然后是this.poller.start();这已经是手动创建线程的标准模式了。
package com.netflix.zuul;
public class FilterFileManager {
private static final Logger LOG = LoggerFactory.getLogger(FilterFileManager.class);
String[] aDirectories;
int pollingIntervalSeconds;
Thread poller;
boolean bRunning;
static FilenameFilter FILENAME_FILTER;
static FilterFileManager INSTANCE;
private FilterFileManager() {
this.bRunning = true;
}
public static void setFilenameFilter(FilenameFilter filter) {
FILENAME_FILTER = filter;
}
public static void init(int pollingIntervalSeconds, String... directories) throws Exception, IllegalAccessException, InstantiationException {
if (INSTANCE == null) {
INSTANCE = new FilterFileManager();
}
INSTANCE.aDirectories = directories;
INSTANCE.pollingIntervalSeconds = pollingIntervalSeconds;
INSTANCE.manageFiles();
INSTANCE.startPoller();
}
public static FilterFileManager getInstance() {
return INSTANCE;
}
public static void shutdown() {
INSTANCE.stopPoller();
}
void stopPoller() {
this.bRunning = false;
}
void startPoller() {
this.poller = new Thread("GroovyFilterFileManagerPoller") {
public void run() {
while(FilterFileManager.this.bRunning) {
try {
sleep((long)(FilterFileManager.this.pollingIntervalSeconds * 1000));
FilterFileManager.this.manageFiles();
} catch (Exception var2) {
var2.printStackTrace();
}
}
}
};
this.poller.setDaemon(true);
this.poller.start();
}








网友评论