简单的ThreadPool实现

pvl*_*spk 4 java concurrency java.util.concurrent threadpool

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

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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要执行的线程数超过taskQueue大小,将会阻塞调用线程吗?ThreadPoolExecutor-在这里我们可以看到在这种情况下这是拒绝执行处理程序的工作,但是我仍然不明白它是如何工作的。在此先感谢您的帮助。

编辑:

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

the*_*dor 5

想象一下,一群砌砖工(您的线程)正在建造一堵墙,以及一堆砖头(您的BlockingQueue)。

每个瓦工都从堆中取出一块砖,将其定位,然后再选择另一个(taskQueue.take())-直到堆中有砖,瓦工才会忙。

卡车不时到达,用更多的砖块装满了堆-但是堆上只有有限的空间,如果没有空间,卡车会停下来等待瓦工使用足够的砖块。

只要堆中有足够的砖块(超过了瓦工的数量),您就可以放心所有瓦工都可以使用-但是当桩空时,瓦工将不得不停止工作,直到新砖交付为止。

您必须选择适当数量的瓦工,很少的瓦工会经常在卡车中等待堆放的空间,太多了,大多数卡车会闲置以等待新砖块。

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

 ExecutorService threadExecutor = Executors.newFixedThreadPool( 3 );
Run Code Online (Sandbox Code Playgroud)

然后您致电:

threadExecutor.submit(Runnable...);
Run Code Online (Sandbox Code Playgroud)

将任务添加到队列中。