Запланируйте периодическую работу в Java с зависимыми рабочими потока?

StackOverflow https://stackoverflow.com/questions/1404306

Вопрос

Вот упрощенная версия моего требования

У меня есть класс Java, скажем, Processor, который содержит метод скажем bigProcess (), все, что он делает, это подключается к файловому серверу, скачивает указанный файл, как только это делается, сохраняет файл в БД и после этого обновляет некоторые поля БД. в разных таблицах.

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

Процессорный класс вызывается каждые 2 часа, и он должен обрабатывать, скажем, от 30 до 40 запросов на каждый вызов. Для улучшения производительности я планирую создать новый поток для каждого запроса (от 30 до 40 потоков), и каждый поток вызывает метод bigProcess.

Теперь мой вопрос заключается в том, нужно ли мне синхронизировать какой-либо из блоков кода в методе bigProcess () (здесь я беспокоюсь о методах полей обновления. Некоторые из методов обновления блокируют строку, например, selecte f1, f2, f3 из t1 для обновления, устанавливает значения для полей f1, f2 и f3 и выполнения коммита)

ПРИМЕЧАНИЕ. Метод bigProcess () не использует переменные экземпляра класса Processor.

Это было полезно?

Решение

Сделайте BigProcess Callable . Когда вы отправляете его в <код > Executor или ExecutorService вы получите Future . Если вы выполните future.get () в 30-40 потоках, эти потоки будут выполняться. будет блокироваться до завершения Callable . Или, если Callable завершен, они немедленно вернут результат.

Альтернативный способ сделать это (что мне очень нравится) - создать пул потоков, передать всю работу в пул потоков. После того, как все работы сданы, завершите работу и дождитесь завершения. Это выглядит примерно так:

ExecutorService threadPool = Executors.newFixedThreadPool(40);
// submit work
threadPool.shutdown();
try {
  threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  // do something
}

Если у вас есть зависимая работа (например, задача B не может быть выполнена до тех пор, пока задача A не будет завершена), то создайте задачу B с Future из задачи A и т. д.

Мне нравится этот подход, потому что все временно. Для одной загрузки из базы данных все процессы будут созданы, запущены и выброшены. Когда вы начинаете создавать постоянный пул потоков, вы сталкиваетесь с другой потенциальной проблемой, и вам сложнее понять, что происходит.

Другие советы

Необходимость синхронизации методов зависит от того, что эти методы на самом деле делают. Как правило, вам нужно синхронизировать, если есть ресурсы, которые используются из нескольких потоков, таких как один файл или одна таблица в базе данных (которую вы фактически записываете и читаете из). Если все процессы, которые вы запускаете, не мешают друг другу, синхронизация не требуется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top