【问题标题】:Simple ThreadPool implementation简单的线程池实现
【发布时间】:2012-10-24 10:24:20
【问题描述】:

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

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

【问题讨论】:

    标签: java concurrency threadpool java.util.concurrent


    【解决方案1】:

    想象一群砌砖工(你的线程)正在建造一堵墙,还有一堆砖头(你的 BlockingQueue)。

    每个砌砖工从堆中取出一块砖,定位它,然后再挑选另一个(taskQueue.take()) - 直到堆中有砖,砌砖工一直忙。

    一辆卡车不时到达,用更多的砖填满堆 - 但堆上只有有限的空间,如果没有空间,卡车就会停下来等待砖匠用完足够的砖。

    只要堆中有足够的砖块(超过砌砖工的数量),您就可以放心,所有砌砖工都会有足够的工作量 - 但是当堆开始变空时,砌砖工将不得不停止工作,直到有新砖块已送达。

    你必须选择合适数量的砌砖工,少则卡车往往会在堆中等待空间,太多则大多数人会闲置等待新砖块。

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

     ExecutorService threadExecutor = Executors.newFixedThreadPool( 3 );
    

    然后你打电话:

    threadExecutor.submit(Runnable...);
    

    将任务添加到队列中。

    【讨论】:

      【解决方案2】:

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

      队列的大小是未运行的任务数。通常,即使线程很忙,它也会为空。拥有与线程数匹配的队列长度没有任何意义,此时也没有什么特别的事情发生。

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

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

      但是,如果它确实有限制并且支持此功能,则典型行为是抛出异常。你可以让它做其他事情,比如阻塞,让当前线程运行任务(这是我的偏好)或忽略任务。

      我仍然无法理解它是如何工作的。

      当您将任务提供()到队列时,如果队列不能接受它,它会返回 false。发生这种情况时调用被拒绝的执行处理程序。

      【讨论】:

        猜你喜欢
        • 2012-03-23
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2011-09-11
        相关资源
        最近更新 更多