私はJavaでタスクのキューを持っています。このキューはDB内のテーブルにあります。M個のスレッド(1タスクにつき1個)を管理してN個のスレッドのみを同時に管理する方法。 N <MでJavaで
私のことを行う必要がありますのみ
- 1スレッド。これはスレッドにDBのやり取りがあり、DB接続の束を開けたくないからです。
私はのような何かを行うことができると思います:
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がどのように動作するかを明確にすることはできますか?
最終的な解決策:awnsersため
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);
}
おかげでたくさん:
私は最善の解決策のようなものだと思います。 BTW私は接続プールを使用していますが、DBへのクエリは非常に重く、私は同時に管理されていない数のタスクを持ちたくありません。
だから私はセマフォーも必要ないと思われますか? – user2427
はい、削除することもできます。 –