gpt4 book ai didi

Java newFixedThreadpool 使前 n 个线程保持挂起状态

转载 作者:行者123 更新时间:2023-12-01 13:50:23 34 4
gpt4 key购买 nike

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

问题如下:假设我们有 100 个线程,N=10。所有的Runnables都通过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

所有 Runnables 运行相同的代码并且不使用共享资源..

有什么想法吗?

最佳答案

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

The threads in the pool will exist until it is explicitly shutdown.

关于Java newFixedThreadpool 使前 n 个线程保持挂起状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20008123/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com