这可能是一个措辞不佳的标题,但我试图从一开始就收集有关我的应用程序的数据和统计信息。我正在使用 JavaFX,并且我有一个模型类将处理所有数据和处理。
我想要的是该模型类从应用程序启动的那一刻开始收集数据(如运行时、线程数、内存使用量......)。但我也希望它每秒不断更新这些值,这意味着我需要它在某种 ScheduledExecutorThread 或其他东西上运行。
我怎样才能做到这一点,从这个程序的一开始,模型类就会每秒运行一次“update()”函数?
这可能是一个措辞不佳的标题,但我试图从一开始就收集有关我的应用程序的数据和统计信息。我正在使用 JavaFX,并且我有一个模型类将处理所有数据和处理。
我想要的是该模型类从应用程序启动的那一刻开始收集数据(如运行时、线程数、内存使用量......)。但我也希望它每秒不断更新这些值,这意味着我需要它在某种 ScheduledExecutorThread 或其他东西上运行。
我怎样才能做到这一点,从这个程序的一开始,模型类就会每秒运行一次“update()”函数?
每当您希望在 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 控制器的那一刻,您可以使用静态方法设置值。