Java newFixedThreadpool保持前n个线程被挂起

时间:2013-11-15 18:30:23

标签: java multithreading threadpool runnable executorservice

我正在使用Executors.newFixedThreadPool(N),其中 N 是代表池容量的任何数字。

问题如下:假设我们有100个线程,N = 10。所有Runnable都通过submit()方法传播到池中(实际上execute方法也有问题)。在Runnable的run()中的所有代码完成后(执行最后一行),池仍然保持前N个线程被挂起,而其他90个成功完成。 因此,改变N值会导致挂起线程数的相应变化。以下是暂停线程调用堆栈的示例:

Unsafe.park(boolean, long) line: not available [native method] [local variables unavailable]    
LockSupport.park(Object) line: 156  
AbstractQueuedSynchronizer$ConditionObject.await() line: 1987   
LinkedBlockingQueue<E>.take() line: 399 
ThreadPoolExecutor.getTask() line: 947  
ThreadPoolExecutor$Worker.run() line: 907   
Thread.run() line: 662  

所有Runnable都运行相同的代码,不使用共享资源..

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

线程池的目的是让线程等待执行任务,以便在必须同时执行任务时不会产生创建新线程的开销。当您通过Executors.newFixedThreadPool(n)创建线程池时,它将有多达n个线程等待执行这些任务。一个他们已经完成了他们的任务,他们将等到提交新任务,并且必须明确终止。来自doc

  

池中的线程将一直存在,直到明确shutdown