この質問は、Java並行処理トピックの宿題に関連しています。私は、新しいスレッドを生成し、与えられたもので制限することを任されていますconcurrencyFactor
。つまり、アクティブなスレッドの数がconcurrencyFactor
以下になるまで、新しいスレッドをディスパッチしてください。アクティブなスレッドの数がconcurrencyFactor
に等しい場合、プログラムはアクティブなスレッドの数がconcurrencyFactor - 1
に減少するまで待機し、新しいスレッドを作成します。Javaの並行性:Executorの動作を実現するためのラッチ/スレッドグループの変更
最初のアプローチとして、私はExecutorService
を使用しており、新しい固定プールをExecutors.newFixedThreadPool(concurrencyFactor);
で作成しました。私のメソッドが呼び出されるたびに、このプールに新しい実行可能ファイルを送信しています。ロジックのコードは次のとおりです。
private final ExecutorService fixedPoolExecutor = Executors.newFixedThreadPool(concurrencyFactor);
public void handleRequest(final RequestHandler handler) {
if (handler == null) throw new IllegalArgumentException("Handler cannot be null");
fixedPoolExecutor.submit(new Runnable() {
@Override
public void run() {
handler.serviceRoutine();
}
});
}
ここで、2番目の部分では、実行者を使用せずに同じ目標を達成するように求めています。私は
1)activeCount
が0
になるまで、このラッチは(つまり、latch.await()
)待機するだろうと、countDownLatch
を使用します。カウントダウンがconcurrencyFactor - 1
になるまで待つだけです。
2)ThreadGroup
を使用し、threadGroup.activeCount() < concurrencyFactor
までお待ちください。しかし、このアプローチの問題は、threadGroup.activeCount() < concurrencyFactor
の条件が満たされるまで着信要求を待機させるにはどうすればいいですか?
private final Lock lock = new ReentrantLock();
private final ThreadGroup threadGroup = new ThreadGroup("myGroup");
public void handleRequest(final RequestHandler handler) {
if (handler == null) throw new IllegalArgumentException("Handler cannot be null");
lock.lock();
try {
while (threadGroup.activeCount() >= concurrencyFactor) {
}
Thread t = new Thread(threadGroup, new Runnable() {
@Override
public void run() {
handler.service();
}
});
t.start();
} finally {
lock.unlock();
}
}
2番目のアプローチでは、いくつかの待機条件でループを置き換えても問題はありませんか?
新しいアプローチの上記のアプローチまたはアドバイスについてのご意見をお待ちしております。
は、あなたがたCountDownLatchを使用するために割り当て力をしていますか? – bowmore
いいえ、強制しません。しかし、命令は、ラッチ/スレッド/エグゼキュータを使用してこれを達成することを示唆しています。 –
これはSemaphoreにとって非常に適しているようです。 – bowmore