我有一种情况,我必须运行大约10,000个线程。显然,一台机器不能并行运行这么多线程。有什么方法可以让我们可以让线程池在开始时运行一些特定数量的线程,一旦一个线程完成,剩下的线程就可以开始处理了吗?
答案 0 :(得分:3)
Executors.newFixedThreadPool(nThreads)
是您最有可能寻找的。一次运行的线程数与指定的线程数一样多。是的,一台机器不能同时并行运行10,000个线程,但它可以同时运行它们。根据每个线程的资源密集程度,在您的情况下使用它可能更有效
Executors.newCachedThreadPool()
其中根据需要创建了多个线程,并且已经完成的线程被重用。
答案 1 :(得分:1)
将export default {
baseUrl: 'http://localhost:3001',
prefix: ''
};
与Executors.newFixedThreadPool(10000)
一起使用将抛出具有那么多线程的OutOfMemory异常。您仍然可以通过向其提交任务而不是同时调用所有任务来使用它,这就是说比invokeAll
更安全。
答案 2 :(得分:0)
对于这个用例。你可以拥有一个带阻塞队列的ThreadPollExecuter。 http://howtodoinjava.com/core-java/multi-threading/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/本教程非常清楚地解释了这一点。
答案 3 :(得分:0)
听起来你想在一组线程上运行10,000个任务。一种相对简单的方法是创建一个List,然后将所有任务添加到列表中,将它们包装在Runnable中。然后,创建一个类,该类获取构造函数中的列表并弹出列表的Runnable然后运行它。必须以某种方式同步此活动。列表为空时,类退出。使用此类启动一些线程。他们会烧掉名单,然后停下来。您的主线程可以监视列表的长度。