我想了解线程池的逻辑,下面有一个简单的错误且不完整的实现:
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
最佳答案
想象一下一群砌砖工(您的线程)和一堆砖(您的 BlockingQueue) build 一堵墙。
每个砌砖工从堆中取出一 block 砖,放置它,然后挑选另一 block (taskQueue.take())——直到堆中有砖,砌砖工一直忙着。
一辆卡车不时到达,用更多的砖 block 填满砖堆 - 但堆上只有有限的空间,如果没有空间,卡车就会停下来等到砌砖工用完足够的砖 block 。
只要堆中有足够的砖(多于砌砖工的数量),您就可以放心,所有砌砖工都会有足够的砖来工作——但是当堆开始变空时,砌砖工将不得不停止工作,直到有新砖已交付。
您必须选择合适数量的砌砖工,少了卡车会经常在堆中等待空位,多了他们中的大多数会闲置等待新砖。
在实现方面,一般来说,Java 给你一个线程池,你很少创建自己的 -
ExecutorService threadExecutor = Executors.newFixedThreadPool( 3 );
然后你调用:
threadExecutor.submit(Runnable...);
将任务添加到队列。
关于java - 简单的线程池实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13217618/