1

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

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

我怎样才能做到这一点,从这个程序的一开始,模型类就会每秒运行一次“update()”函数?

4

1 回答 1

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 上的线程成为一个守护进程......所以你需要一个自定义线程工厂.....

上面的代码将立即启动,如果有控制器,则每秒更新一次。

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

于 2014-10-01T19:44:36.753 回答