我正在努力做一些简单的事情...

我的真实项目多年来一直遭受着一个未知问题的困扰,他们决定创建一个非常简单的测试,结果让我感到害怕...

这是测试:

ExecutorService t = new ThreadPoolExecutor(10, 20, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(600));
        for (int i = 0; i < 100; i++) {
            final int i1 = i;
            t.execute(new Runnable() {

                @Override
                public void run() {
                    while (true) {
                        System.out.println(i1);
                        try {
                            Thread.sleep(5000);
                        }
                        catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                }
            });
        }

我正在创建一个包含10个核心线程加20个maximumPoolSize的线程池
然后我给它100个线程,每个线程将简单地打印一个固定的数字...

我愚蠢的想法是:



这对我来说很明显,因为maxSize为20,在最坏的情况下它应该接受20个任务...

但结果是永远打印0-9

问题是:如果永不安排执行额外的线程,那么maximumPoolSize的意义是什么?

最佳答案

正如@Oleg指出的那样,该池工作正常,但是有一个我不知道的实现细节。

仅当任务队列为FULL时,才会创建额外的线程

这篇文章更好地解释了:
http://www.bigsoft.co.uk/blog/2009/11/27/rules-of-a-threadpoolexecutor-pool-size



因此,Java等待最后一秒钟,直到队列耗尽以创建新线程...

10-07 12:21