有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

线程池Java FixedThreadPool无法使用设置的池大小?

我正在为工作线程使用FixedThread池。以下是我创建它的方式:

ThreadPoolExecutor producerThreadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(25);

所以我将它的大小设置为25,我假设在任何时候最多只有25个活动线程?(如果我错了,请纠正我)

然后,如果线程池中有空闲线程,我的主线程会不断尝试一次提交30个工作线程:

if(producerThreadPool.getActiveCount() <= 25)

但当我调试它时,我得到了以下日志:

Mon Jul 23 14:04:42 EDT 2012: {"queued_count":"0","active_count":"28","scheduled_tasks":"28","core_pool_size":"1000","pool_size":"29"}
Mon Jul 23 14:04:43 EDT 2012: {"queued_count":"0","active_count":"3","scheduled_tasks":"33","core_pool_size":"1000","pool_size":"34"}
Mon Jul 23 14:04:44 EDT 2012: {"queued_count":"0","active_count":"0","scheduled_tasks":"60","core_pool_size":"1000","pool_size":"60"}
Mon Jul 23 14:04:45 EDT 2012: {"queued_count":"0","active_count":"0","scheduled_tasks":"90","core_pool_size":"1000","pool_size":"90"}
...

队列总是空的,核心池大小仍然是1000,池大小一直增加到1000,但我假设核心池大小应该是25,应该有排队的任务

我是做错了什么还是误解了

任何帮助都将不胜感激,谢谢

我是这样生成日志的:

HashMap<String, String> log = new HashMap<String, String>();
log.put("core_pool_size", Integer.toString(producerThreadPool.getCorePoolSize()));
log.put("scheduled_tasks", Long.toString(producerThreadPool.getTaskCount()));
log.put("pool_size", Integer.toString(producerThreadPool.getPoolSize()));
log.put("active_count", Integer.toString(producerThreadPool.getActiveCount()));
log.put("queued_count", Integer.toString(producerThreadPool.getQueue().size()));
String gson_str = gson.toJson(log);

共 (1) 个答案

  1. # 1 楼答案

    根据文档ThreadPoolExecutor.getActiveCount()它只给出了一个大概的计数,考虑到获得准确值所需的开销,这是相当公平的。因此,当您看到“28”时,实际上可能不是28个线程同时运行,但在函数调用期间,它统计了28个线程