Это может быть плохо сформулированное название, но я пытаюсь собрать данные и статистику по моему приложению с самого начала. Я использую 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 был Daemon thead... поэтому вам нужна фабрика пользовательских нитей.....
Вышеуказанный код начнется немедленно и будет обновлять контроллер, если он есть один раз в секунду.
В момент создания c-контроллера вы можете установить значение, используя статический метод.