There is a queue of tasks, created as follows:
LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(maximumPoolSize, maximumPoolSize, 50000L, TimeUnit.MILLISECONDS, queue); The maximumPoolSize value is 200. During operation, a large number of threads (more than a thousand) hit the queue , but the value returned by the threadPoolExecutor.getActiveCount() method is always less than or equal to 100. For example, the values ββof threadPoolExecutor.getActiveCount() and queue.size() logged in the following way:
logger.debug("ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: " + threadPoolExecutor.getActiveCount() + ". Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ " + queue.size() + " ΠΏΠΎΡΠΎΠΊΠΎΠ²."); and as a result we get the following picture:
ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 1. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 0 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 2. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 0 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 3. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 0 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 4. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 0 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 5. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 0 ΠΏΠΎΡΠΎΠΊΠΎΠ². ... ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 86. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 0 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 87. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 88. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 89. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 90. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1 ΠΏΠΎΡΠΎΠΊΠΎΠ². ... ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 99. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 2 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 3 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 4 ΠΏΠΎΡΠΎΠΊΠΎΠ². ... ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1874 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1875 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1876 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1877 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1878 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1879 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1880 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1881 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1882 ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ: 100. Π ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ 1883 ΠΏΠΎΡΠΎΠΊΠΎΠ². The documentation says that the threadPoolExecutor.getActiveCount() method returns an approximate number of threads with actively running tasks. But why the maximum threshold of this approximate value here is maximumPoolSize / 2?
PS This logs are not from my computer, I could not reproduce this situation - in my case the number of active threads is 200, as expected. Could this be a dependence on the number of processors / number of processor cores / any software configuration?
ThreadPoolExecutordocumentation. Look at the mini benchmark , which helps determine the optimal size of the pool and queue. - enzo