Multithreading 限制Groovy中的线程数

Multithreading 限制Groovy中的线程数,multithreading,grails,groovy,Multithreading,Grails,Groovy,如何限制同时执行的线程数? 以下是我的算法示例: for(i = 0; i < 100000; i++) { Thread.start { // Do some work } } (i=0;i

如何限制同时执行的线程数? 以下是我的算法示例:

for(i = 0; i < 100000; i++) {
    Thread.start {
        // Do some work
    }
}
(i=0;i<100000;i++)的
{
Thread.start{
//做些工作
}
}
我想确保一旦应用程序中的线程数达到100,算法将暂停/等待,直到应用程序中的线程数低于100

目前“一些工作”需要一些时间,我的应用程序中只有几千个线程。最终,它会耗尽线程,“一些工作”崩溃。我想通过限制它一次可以使用的池的数量来解决这个问题


请告诉我如何解决我的问题。

我相信您正在Java并发API中寻找
ThreadPoolExecutor
。这里的想法是,您可以定义池中线程的最大数量,然后不使用Runnable启动新线程,只需让
ThreadPoolExecutor
管理线程的上限即可

从这里开始:

import java.util.concurrent.*;
导入java.util.*;
def队列=新阵列锁定队列(50000)
def tPool=新线程池执行器(5500,20,TimeUnit.SECONDS,队列);
对于(i=0;i<5000;i++){
tPool.execute{
打印“废话”
}
}
ThreadBlockingQueue构造函数的参数:
corePoolSize(5)
,如果系统空闲,这是要创建和维护的线程数,
maxPoolSize(500)
MaxNumber of threads to create,第三个和第四个参数说明池应保持空闲线程至少20秒,队列参数是一个存储排队任务的阻塞队列


您需要考虑的是队列大小以及如何处理被拒绝的任务。如果你需要执行100k个任务,你要么必须有一个可以容纳100k个任务的队列,要么必须有一个处理被拒绝任务的策略。

有可能得到一个小例子吗?@Melr-我添加了一个例子,就这样。奇怪的是,上面的例子在Grails中并没有预期的表现:(.谢谢你的回答,我想我可能需要问另一个问题,特定于Grails环境。Groovy 2?这就是我使用的,我在控制台中验证了它。我猜你可能正在使用Groovy的早期版本。我正在开发Grails(2.0.1)项目。
import java.util.concurrent.*;
import java.util.*;

def queue = new ArrayBlockingQueue<Runnable>( 50000 )
def tPool = new ThreadPoolExecutor(5, 500, 20, TimeUnit.SECONDS, queue);

for(i = 0; i < 5000; i++) {
    tPool.execute {
      println "Blah"
    }
}