【发布时间】:2009-09-13 05:31:54
【问题描述】:
我在 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);
}
非常感谢遮阳篷。顺便说一句,我正在使用连接池,但是对数据库的查询非常繁重,我不想同时拥有不受控制的任务数量。
【问题讨论】:
标签: java concurrency multithreading