Запланируйте периодическую работу в Java с зависимыми рабочими потока? - PullRequest
1 голос
/ 10 сентября 2009

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 10 сентября 2009

Сделать 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 и т. Д.

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

1 голос
/ 10 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...