java - 简单的线程池实现

标签 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 < 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/

相关文章:

java - 是否有带多个队列的开箱即用的线程池(确保每个队列的串行处理)?

Java:何时使用线程池的指南?

java - Dijkstra最短路径算法: finding number of checked vertices

java - 如何加速分布式图算法的性能?

java - java中不可比较的类型

java - 在 Swing 的 JTextArea 上使用 setText 时出现死锁

go - 不用互斥量的goroutines

java - 嵌入式系统中线程池的优点

java - 为什么我安装的 Tomcat 不起作用?

Java JSF h :outPutText - no tag was defined