У меня есть очередь задач в Java. Эта очередь находится в таблице в БД.
Мне нужно:
- 1 поток только для задачи
- Одновременно работает не более N потоков. Это связано с тем, что потоки взаимодействуют с БД, и я не хочу, чтобы открывалась куча соединений с БД.
Я думаю, я мог бы сделать что-то вроде:
final Semaphore semaphore = new Semaphore(N);
while (isOnJob) {
List<JobTask> tasks = getJobTasks();
if (!tasks.isEmpty()) {
final CountDownLatch cdl = new CountDownLatch(tasks.size());
for (final JobTask task : tasks) {
Thread tr = new Thread(new Runnable() {
@Override
public void run() {
semaphore.acquire();
task.doWork();
semaphore.release();
cdl.countDown();
}
});
}
cdl.await();
}
}
Я знаю, что класс ExecutorService существует, но я не уверен, смогу ли я использовать его для этого.
Итак, вы думаете, что это лучший способ сделать это? Или не могли бы вы разъяснить мне, как работает ExecutorService, чтобы решить эту проблему?
окончательное решение:
Я думаю, что лучшим решением будет что-то вроде:
while (isOnJob) {
ExecutorService executor = Executors.newFixedThreadPool(N);
List<JobTask> tasks = getJobTasks();
if (!tasks.isEmpty()) {
for (final JobTask task : tasks) {
executor.submit(new Runnable() {
@Override
public void run() {
task.doWork();
}
});
}
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);
}
Большое спасибо за это. Кстати, я использую пул соединений, но запросы к БД очень тяжелые, и я не хочу иметь неконтролируемое количество задач одновременно.