这可能是一个措辞不好的标题,但我试图从一开始就收集有关我的应用程序的数据和统计数据。我正在使用JavaFX,我有一个模型类,它将处理所有数据和处理。
我想要的是该模型类从应用程序启动的那一刻开始收集数据(如运行时,线程数,内存使用情况......)。但是我也希望它每秒都能不断更新这些值,这意味着我需要在某种ScheduledExecutorThread上运行它。
我怎么能这样做,从这个程序的一开始,模型类将运行" update()"每秒都有功能吗?
答案 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控制器的那一刻,您可以使用静态方法设置值。