Java 关于如何创建守护进程线程以监视映射的最佳实践

Java 关于如何创建守护进程线程以监视映射的最佳实践,java,multithreading,scheduled-tasks,daemon,Java,Multithreading,Scheduled Tasks,Daemon,我有一个类,它有一个静态映射,不断地随机更新 class MyMap{ private static Map my_map= new Map(); //setters //getters } 我想创建一个MapObserver类,它可以生成一次守护进程线程。此线程调用读取映射的方法 class MapObserver{ private static boolean initialised = false; private static final ScheduledExecutorServic

我有一个类,它有一个静态映射,不断地随机更新

class MyMap{
private static Map my_map= new Map();
//setters
//getters
}
我想创建一个MapObserver类,它可以生成一次守护进程线程。此线程调用读取映射的方法

class MapObserver{
private static boolean initialised = false;
private static final ScheduledExecutorService exec = 
        Executors.newScheduledThreadPool(1, new ThreadFactory() {

        public Thread newThread(Runnable r) {
            Thread t = Executors.defaultThreadFactory().newThread(r);
            t.setDaemon(true);
            return t;
        }
    });
public static void startObserverThread() {
        if (!initialised) {
            exec.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {

                    //read method
                }

            }, 0, 5, TimeUnit.SECONDS);
            initialised=true;
        }
    }
}
如何以及在何处初始化该类,以便它只初始化一次,并且不会产生额外的线程。
这是监视我的地图的好方法。

如果您有一个静态地图,只需放置一个静态()线程或MapObserver即可

不管你的问题是否会被否决,因为你所描述的监视对象状态的方法是非常糟糕的。请阅读并学习

正确的方法可能是创建一个facade(一个Map子类覆盖
put
方法,通知需要通知的内容),如果有人有更好的想法,可以随意评论


如果您有一个用例会限制您使用此选项或强制您使用一个单独的线程(不考虑锁定等),您需要在问题中指定它

如果这是一个单例,则将类设置为final,并将其构造函数设置为private。否则它看起来更像是属于“是的,我做的,单身”。但是如何初始化这个类呢?(仅一次)您可能想要使用
静态初始值设定项块
,或者您可以在
main
-方法中调用
startObserverThread
。您可以创建一个静态getter来返回singleton实例,在那里您可以初始化singleton对象(或搜索静态初始值设定项块)我不需要监视地图的更新。地图中的值是时间,每当该时间小于当前时间时,我需要弹出警报。因此,我必须使用seprate线程并在映射上迭代,以了解超过了多少时间。