【问题标题】:Java newFixedThreadpool keeps the first n threads suspendedJava newFixedThreadpool 保持前 n 个线程挂起
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多