Как запустить поток с фиксированным интервалом с момента запуска приложения?

1

Это может быть плохо сформулированное название, но я пытаюсь собрать данные и статистику по моему приложению с самого начала. Я использую JavaFX, и у меня есть модельный класс, который будет обрабатывать все данные и обработку.

Я хочу, чтобы этот класс модели начал собирать данные (например, время выполнения, количество потоков, использование памяти...) с момента запуска приложения. Но я также хочу, чтобы он постоянно обновлял эти значения каждую секунду, а это значит, что мне нужно, чтобы он запускался на каком-то ScheduledExecutorThread или что-то в этом роде.

Как я могу сделать так, что с самого начала этой программы класс модели будет запускать функцию "update()" каждую секунду?

  • 0
    @G Боггс Взгляните на это .
  • 0
    @Chris Крис Я не совсем уверен, что это то, что я хочу сделать. Я хочу, чтобы класс начал собирать данные с самого начала. Прежде всего, как я могу это сделать. Во-вторых, я не хочу вызывать функцию, я хочу, чтобы она по существу запускала поток.
Теги:
multithreading
javafx-2

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 был Daemon thead... поэтому вам нужна фабрика пользовательских нитей.....

Вышеуказанный код начнется немедленно и будет обновлять контроллер, если он есть один раз в секунду.

В момент создания c-контроллера вы можете установить значение, используя статический метод.

  • 0
    Хорошо, вот о чем я думал. Но моя проблема в том, что у меня есть класс модели, в котором происходит сбор всех данных. Если я хочу, чтобы этот класс начал сбор данных с момента запуска программы, как мне это сделать? А также, как я могу заставить SeS запускаться самостоятельно?
  • 1
    Позвольте мне обновить немного подробнее ... Является ли метод 'update ()' статическим методом?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню