我想了解线程池的逻辑,下面有一个简单的不正确且不完整的实现:
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