Подтвердить что ты не робот

Запуск потока Java в интервалах

У меня есть поток, который нужно выполнять каждые 10 секунд. Этот поток содержит несколько вызовов (12 - 15) в базу данных на другом сервере. Кроме того, он также обращается к 3 файлам. Следовательно, будет много ИО и сетевых накладных расходов.

Какова наилучшая стратегия для выполнения вышеизложенного?

Один из способов - использовать метод сна вместе с циклом while, но это будет плохой дизайн.

Будет ли полезен класс, подобный Timer? Кроме того, было бы лучше создать еще пару потоков (один для IO и один для JDBC), вместо того, чтобы они запускались в одном потоке?

4b9b3361

Ответ 1

Я нахожу, что ScheduledExecutorService - отличный способ сделать это. Это, возможно, немного сложнее, чем Timer, но дает большую гибкость в обмене (например, вы можете использовать один поток или пул потоков, он принимает единицы, отличные от миллисекунд).

ScheduledExecutorService executor =
    Executors.newSingleThreadScheduledExecutor();

Runnable periodicTask = new Runnable() {
    public void run() {
        // Invoke method(s) to do the work
        doPeriodicWork();
    }
};

executor.scheduleAtFixedRate(periodicTask, 0, 10, TimeUnit.SECONDS);

Ответ 2

Посмотрите Timer и TimerTask. Они именно то, что вы хотите.

Вы можете сделать реализацию TimerTask, которая принимает ваш объект потока в конструкторе.

Затем метод запуска вызовет метод выполнения потоков.

// Perhaps something like this
Timer t = new Timer();
t.scheduleAtFixedRate(yourTimerTask, 0, 10 * 1000);
// Hopefully your task takes less than 12 seconds

Ответ 3

Один из вариантов заключается в создании ScheduledExecutorService, с которой вы можете запланировать свое задание:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
ex.scheduleWithFixedDelay(...);

Если вы решили иметь несколько потоков, тогда вы можете создать ScheduledExecutorService с большим количеством потоков (опять же, через класс Executors).

С точки зрения количества потоков и того, что вы вкладываете в каждый поток, с точки зрения производительности, я бы сказал, это зависит от:

  • для вашего конкретного приложения, может ли один поток действительно "работать", а другой ожидает ввода-вывода?
  • Ваш многопоточный поток в конечном итоге "трэширует тот же ресурс" (например, читает из файлов в разных местах в одном и том же домене) и, таким образом, замедляет друг друга или они будут одновременно ударять разные ресурсы?