【发布时间】:2013-11-29 06:17:15
【问题描述】:
我使用的是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 运行相同的代码并且不使用共享资源..
有什么想法吗?
【问题讨论】:
标签: java multithreading threadpool runnable executorservice