6

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

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

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

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

请让我知道如何解决我的问题。

4

1 回答 1

10

我相信您正在寻找ThreadPoolExecutorJava 并发 API 中的一个。这里的想法是,您可以定义池中的最大线程数,然后无需使用 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 参数是一个阻塞队列,用于存储排队的任务。

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

于 2012-11-20T01:50:43.377 回答