Запуск потока Java в интервалах
У меня есть поток, который нужно выполнять каждые 10 секунд. Этот поток содержит несколько вызовов (12 - 15) в базу данных на другом сервере. Кроме того, он также обращается к 3 файлам. Следовательно, будет много ИО и сетевых накладных расходов.
Какова наилучшая стратегия для выполнения вышеизложенного?
Один из способов - использовать метод сна вместе с циклом while, но это будет плохой дизайн.
Будет ли полезен класс, подобный Timer? Кроме того, было бы лучше создать еще пару потоков (один для IO и один для JDBC), вместо того, чтобы они запускались в одном потоке?
Ответы
Ответ 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).
С точки зрения количества потоков и того, что вы вкладываете в каждый поток, с точки зрения производительности, я бы сказал, это зависит от:
- для вашего конкретного приложения, может ли один поток действительно "работать", а другой ожидает ввода-вывода?
- Ваш многопоточный поток в конечном итоге "трэширует тот же ресурс" (например, читает из файлов в разных местах в одном и том же домене) и, таким образом, замедляет друг друга или они будут одновременно ударять разные ресурсы?