gpt4 book ai didi

java - 创建动态(增长/收缩)线程池

转载 作者:太空狗 更新时间:2023-10-29 22:56:09 25 4
gpt4 key购买 nike

我需要在 Java (java.util.concurrent) 中实现一个线程池,其线程数在空闲时处于某个最小值,当作业提交到其中的速度快于它们完成执行,并在所有作业完成并且没有更多作业提交时收缩回下限。

你会如何实现这样的东西?我想这将是一个相当常见的使用场景,但显然 java.util.concurrent.Executors 工厂方法只能创建固定大小的池和在提交许多作业时无限增长的池。 ThreadPoolExecutor 类提供了 corePoolSizemaximumPoolSize 参数,但它的文档似乎暗示只有 corePoolSize 个线程同时存在是为了使用有界作业队列,在这种情况下,如果您达到了 maximumPoolSize 个线程,您将得到作业拒绝,您必须自己处理?我想到了这个:

//pool creation
ExecutorService pool = new ThreadPoolExecutor(minSize, maxSize, 500, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(minSize));
...

//submitting jobs
for (Runnable job : ...) {
while (true) {
try {
pool.submit(job);
System.out.println("Job " + job + ": submitted");
break;
} catch (RejectedExecutionException e) {
// maxSize jobs executing concurrently atm.; re-submit new job after short wait
System.out.println("Job " + job + ": rejected...");
try {
Thread.sleep(300);
} catch (InterruptedException e1) {
}
}
}
}

我是不是忽略了什么?有一个更好的方法吗?此外,根据一个人的要求,上面的代码至少要等到(我认为)(total number of jobs) - maxSize jobs 完成后才能完成,这可能会有问题。因此,如果您希望能够将任意数量的作业提交到池中并立即继续而不等待它们中的任何一个完成,我看不出如果没有专门的“作业提交”线程来管理,您将如何做到这一点所需的无限队列来保存所有提交的作业。 AFAICS,如果您为 ThreadPoolExecutor 本身使用无界队列,它的线程数将永远不会超过 corePoolSize。

最佳答案

当增长和收缩与线程一起出现时,我脑海中只有一个名字:来自 java.util.concurrent 包的 CachedThreadPool。

ExecutorService executor = Executors.newCachedThreadPool();

CachedThreadPool() 可以重用线程,以及在需要时创建新线程。是的,如果一个线程空闲 60 秒,CachedThreadPool 将杀死它。所以这是非常轻量级的——用你的话来说就是增长和收缩!

关于java - 创建动态(增长/收缩)线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11249342/

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