MeI*_*eIr 6 grails groovy multithreading
如何限制同时执行的线程数?这是我的算法示例:
for(i = 0; i < 100000; i++) {
Thread.start {
// Do some work
}
}
Run Code Online (Sandbox Code Playgroud)
我想确保一旦我的应用程序中的线程数达到100,算法将暂停/等待,直到应用程序中的线程数低于100.
目前"一些工作"需要一些时间来做,我最终在我的应用程序中有几千个线程.最终它耗尽线程和"一些工作"崩溃.我想通过限制它可以一次使用的池数来解决它.
请让我知道如何解决我的问题.
Tim*_*ien 10
我相信您正在寻找ThreadPoolExecutorJava Concurrency 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"
}
}
Run Code Online (Sandbox Code Playgroud)
ThreadBlockingQueue构造函数的参数:corePoolSize (5),这是在系统空闲时创建和维护maxPoolSize (500)的线程数,要创建的最大线程数,第3和第4个参数表明池应该保持空闲线程至少20秒, queue参数是一个存储排队任务的阻塞队列.
您想要使用的是队列大小以及如何处理被拒绝的任务.如果您需要执行100k任务,您将需要拥有一个可以容纳100k任务的队列,或者您必须拥有处理被拒绝任务的策略.
| 归档时间: |
|
| 查看次数: |
2020 次 |
| 最近记录: |