スレッドプールのロジックを理解したいのですが、以下に単純で正しくない、完全ではない実装があります。
class ThreadPool {
private BlockingQueue<Runnable> taskQueue;
public ThreadPool(int numberOfThreads) {
taskQueue = new LinkedBlockingQueue<Runnable>(10);
for (int i = 0; i < numberOfThreads; i++) {
new PoolThread(taskQueue).start();
}
}
public void execute(Runnable task) throws InterruptedException {
taskQueue.put(task);
}
}
class PoolThread extends Thread {
private BlockingQueue<Runnable> taskQueue;
public PoolThread(BlockingQueue<Runnable> queue) {
taskQueue = queue;
}
public void run() {
while (true) {
try {
taskQueue.take().run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
実行するスレッドの数が taskQueue のサイズを超えた場合、呼び出しスレッドはブロックされますか? ThreadPoolExecutor - ここで、この場合は拒否された実行ハンドラの動作であることがわかりますが、どのように機能するのかまだ理解できません。助けてくれてありがとう。
編集:
ブロッキング キューの最大サイズを 10 に設定します