gpt4 book ai didi

java - ThreadPoolExecutor 在低负载时不收缩

转载 作者:行者123 更新时间:2023-11-30 06:31:31 26 4
gpt4 key购买 nike

在我的程序中,大多数时候任务很少提交给执行器,但它们并没有完全停止。当许多任务同时提交时,会出现周期性的突发。

即使设置了 allowCoreThreadTimeOut 并且大多数情况下只有一个线程就足够了,但冗余的执行程序线程不会停止。

这是因为执行器阻塞队列的公平性:当多个线程等待时,所有线程都有平等的机会获得任务,并且它们的空闲时间不会显着增长。

有解决办法吗?例如,一个队列在多个等待线程的情况下返回具有最低 id 的线程?

public class ShrinkTPE {

public static void main(final String[] args) throws Exception {
final ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors
.newFixedThreadPool(NTHREADS);
executor.setKeepAliveTime(ALIVE_TIME, TimeUnit.SECONDS);
executor.allowCoreThreadTimeOut(true);

// thread alive time is 10s
// load all threads with tasks at start and every 12s
// also submit one task each second
for (int i = 0;; i++) {
int j = 0;
do {
if (false && !mostThreadsUnused(i))
break;
final int i2 = i, j2 = j;
executor.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
System.out.println(""
+ Thread.currentThread().getName() + " " + i2
+ " " + j2);
Thread.sleep(300);
return null;
}
});
} while (mostThreadsUnused(i) && ++j < NTHREADS);
Thread.sleep(1000);
System.out.println();
}
}

private static boolean mostThreadsUnused(final int i) {
return i % (ALIVE_TIME + 2) == 0;
}

private static final int NTHREADS = 5;

private static final int ALIVE_TIME = 10;
}

最佳答案

final ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(N_THREAD);

您正在使用 fixedThreadPool,这意味着该池将始终拥有 N_THREAD 个线程。 allowCoreThreadTimeout 在这里被忽略。

使用不同的线程池,也许CachedThreadPool?它将重用现有线程,但如果您向池中提交新任务,它将启动额外的线程,并且不会有空闲线程。

空闲线程在 X 时间后死亡(默认 60 秒空闲)

关于java - ThreadPoolExecutor 在低负载时不收缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46005676/

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