如何从应用程序的开始运行固定间隔线程?

时间:2014-10-01 19:28:32

标签: java multithreading javafx-2 periodic-task

这可能是一个措辞不好的标题,但我试图从一开始就收集有关我的应用程序的数据和统计数据。我正在使用JavaFX,我有一个模型类,它将处理所有数据和处理。

我想要的是该模型类从应用程序启动的那一刻开始收集数据(如运行时,线程数,内存使用情况......)。但是我也希望它每秒都能不断更新这些值,这意味着我需要在某种ScheduledExecutorThread上运行它。

我怎么能这样做,从这个程序的一开始,模型类将运行" update()"每秒都有功能吗?

1 个答案:

答案 0 :(得分:1)

任何时候您都希望在Java中进行固定间隔操作,您应该调查ScheduledExecutorService。在你的情况下,像:

private static final ScheduledExecutorService SERVICE = Executors.newScheduledThreadPool(1,
    new ThreadFactory() {
        public Thread newThread(Runnable r) {
            Thread t = new Thread("Tick Thread", r);
            t.setDaemon(true);
            return t;
        }
    });

private static final AtomicReference<Controller> CONTROLLER = new AtomicReference<>();

public static final void setController(Controller c) {
    CONTROLLER.compareAndSet(null, c);
}

static {

    Runnable task = new Runnable() {
        public void run() {
            //do something each second....
            // call the 'update()' method:
            Controller c = CONTROLLER.get();
            if (c != null) {
                c.update();
            }
        }
    }

    // delay 1 second, repeat each second.
    service.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS);
}

你可以把它,并把它放在类的静态初始化器中,你将在加载类的时候启动系统....你可能希望ExecutorService上的线程成为守护进程的thead ...所以你需要一个自定义线程工厂.....

以上代码将立即启动,并且如果每秒都有一个控制器,则会更新控制器。

创建c控制器​​的那一刻,您可以使用静态方法设置值。

相关问题