Выполнение потока Java в интервалах - PullRequest
14 голосов
/ 09 января 2009

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

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

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

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

Ответы [ 3 ]

41 голосов
/ 09 января 2009

Я считаю, что 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);
4 голосов
/ 09 января 2009

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

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

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

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

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

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

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

Затем метод run вызовет метод run потоков.

// Perhaps something like this
Timer t = new Timer();
t.scheduleAtFixedRate(yourTimerTask, 0, 10 * 1000);
// Hopefully your task takes less than 12 seconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...