继续从zuul里看一个类,懒汉式单例的实现

2022-05-19  本文已影响0人  天草二十六_简村人

本文我们将分析懒汉式单例模式的写法

static FilterFileManager INSTANCE;
    private FilterFileManager() {
        this.bRunning = true;
    }
    public static FilterFileManager getInstance() {
        return INSTANCE;
    }

与饿汉式的区别是,懒汉式对实例的初始化,是在init()公共方法调用的时候,如果实例不为null, 才进行初始化实例。

       if (INSTANCE == null) {
            INSTANCE = new FilterFileManager();
        }

该类的核心实现是创建一个线程(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();
    }

上一篇 下一篇

猜你喜欢

热点阅读