【问题标题】:Limit number of threads in Groovy限制 Groovy 中的线程数
【发布时间】:2012-11-08 01:07:06
【问题描述】:

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

for(i = 0; i < 100000; i++) {
    Thread.start {
        // Do some work
    }
}

我想确保一旦我的应用程序中的线程数达到 100,算法将暂停/等待,直到应用程序中的线程数低于 100。

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

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

【问题讨论】:

    标签: multithreading grails groovy


    【解决方案1】:

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

    从这里开始:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

    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"
        }
    }
    

    ThreadBlockingQueue 构造函数的参数:corePoolSize (5),这是在系统空闲时要创建和维护的线程数,maxPoolSize (500) 要创建的最大线程数,第 3 和第 4 个参数说明池应保留闲置线程至少 20 秒,并且 queue 参数是一个阻塞队列,用于存储排队的任务。

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

    【讨论】:

    • 能否举个小例子?
    • @Melr - 我添加了一个例子,你去吧。
    • 奇怪的是,上面的例子在 Grails 中的表现并不像预期的那样:(。谢谢你的回答,我想我可能不得不问另一个问题,特定于 Grails 环境。
    • Groovy 2?这就是我使用的,我在控制台中验证了它。我猜你可能使用的是早期版本的 groovy
    • 我正在开发 Grails (2.0.1) 项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多