java 线程池使用无界LinkedBlockingDeque队列,运行线程个数问题

古月楼 发布于 2013/09/04 14:36
阅读 4K+
收藏 0
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 20, 3,
					TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(),
					new ThreadPoolExecutor.CallerRunsPolicy()) {
				protected void terminated() {
					log.debug("threadPool shutdown  time : "
							+ new Date().toGMTString());
				}
			};

1:问题:
     以上如果有十万个任务需要处理,则线程池会有多少个线程在运行呢?

     我自己做的例子得出的结论是只有一个线程在运行。原因是线程池初始化1个线程,最大20个线程。如果需要新增线程来处理任务的前提条件是 当前运行的线程小于20<参数:maximumPoolSize>并且队列满的情况下才会新增线程。但是我使用的是无界队列。这个queue可以说是无界的了<Integer.MAX_VALUE>。是不会蛮的。我的理解和自己写test证实了这段代码里面只会有一个线程在运行任务。

不知道我的理解和test代码是否有问题。敬请各位来讨论!!!


加载中
0
悟方向
悟方向
提交的任务会先往队列中放 队列满了才会增大线程数 
悟方向
悟方向
回复 @luckyJie : 你可以看一下API文档中的说明
古月楼
古月楼
回复 @luckyJie : 刚刚试了下,如果corePoolSize是10,在第一次提交的时候线程池会启动10个线程来处理任务集合的前10个任务。然后把剩余的放到队列里面。
古月楼
古月楼
回复 @享开发 : 这个赞同,那一般容量跟任务大小怎么来权衡呢?
悟方向
悟方向
回复 @luckyJie : 那是因为你这样写代码有问题 一般来说 那个队列要有界的 同时容量也不宜太大 否则吞吐量会有问题
古月楼
古月楼
回复 @luckyJie : 第一次提交任务,他会启动20个线程,然后把剩余的任务放到队列里面。不会一提交就会放到队列里面的。
下一页
0
JackJew
JackJew
看一下ThreadPoolExecutor的构造器和execute方法源码就好了
古月楼
古月楼
恩。谢谢
返回顶部
顶部