Java 简单线程池实现

Java 简单线程池实现,java,concurrency,threadpool,java.util.concurrent,Java,Concurrency,Threadpool,Java.util.concurrent,我想了解线程池的逻辑,下面有一个简单的错误且不完整的实现: class ThreadPool { private BlockingQueue<Runnable> taskQueue; public ThreadPool(int numberOfThreads) { taskQueue = new LinkedBlockingQueue<Runnable>(10); for (int i = 0; i < numbe

我想了解线程池的逻辑,下面有一个简单的错误且不完整的实现:

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();
            }
        }
    }
}
类线程池{
私有阻塞队列任务队列;
公共线程池(int numberOfThreads){
taskQueue=新的LinkedBlockingQueue(10);
for(int i=0;i
如果要执行的线程数超过taskQueue大小,调用线程会被阻塞吗在这里我们可以看到,在这种情况下,这是一个被拒绝的执行处理程序的工作,但我仍然无法理解它是如何工作的。提前感谢您的帮助

编辑:

将阻塞队列的最大大小设置为10

如果要执行的线程数超过taskQueue大小,调用线程会被阻塞吗

队列的大小是未运行的任务数。通常,即使线程很忙,它也将是空的。拥有一个与线程数匹配的队列长度没有意义,在这一点上也没有什么特别的事情发生

这里我们可以看到,在这种情况下,这是一个被拒绝的执行处理程序的工作

仅当队列已满时才调用拒绝处理程序。您的队列没有限制,因此即使您支持此功能,也不会调用它

但是,如果它确实有限制并且支持此功能,典型的行为是抛出异常。您可以让它执行其他操作,如阻塞、让当前线程运行任务(这是我的首选)或忽略任务

我仍然不明白它是如何工作的


向队列提供()任务时,如果队列无法接受,则返回false。当发生这种情况时,调用被拒绝的执行处理程序。

想象一下,一群砌砖工人(你的线程)正在筑墙,一堆砖块(你的阻塞队列)

每个砌砖工人从砖堆中取出一块砖,将其放置好,然后再挑选另一块(taskQueue.take())-直到砖堆中有砖为止,砌砖工人都很忙

一辆卡车时不时地来,用更多的砖块填满砖头——但砖头上的空间有限,如果没有空间,卡车会停下来,等待砖匠使用足够的砖头

只要砖堆中有足够的砖(超过砌砖工人的数量),你可以放心,所有的砌砖工人都有足够的砖来工作——但当砖堆开始变空时,砌砖工人将不得不停止工作,直到新砖交付

你必须挑选适当数量的砌砖工人,数量很少,卡车通常会在堆中等待空间,太多的人,他们中的大多数人会空闲等待新砖

在实现方面,一般来说,Java为您提供了一个线程池,您很少创建自己的线程池-

 ExecutorService threadExecutor = Executors.newFixedThreadPool( 3 );
然后你打电话:

threadExecutor.submit(Runnable...);
将任务添加到队列