如何减慢java中Threads的生成速度?

时间:2012-04-04 20:11:32

标签: java multithreading

我正在产生20个线程(它们都应该同时运行)。然而, 它们都是在同一时间创建的,并且都在同一时间开始运行,这使得整个程序主要滞后(这是滞后,我的计算机并不慢)。

所以,我希望在不同的时间创建它们,例如每2秒生成一个左右。我该怎么做呢?我尝试过使用大量的东西,但没有一种能按照我想要的方式工作。我尝试使用布尔方法不再循环,直到它为真,但这似乎不起作用。有什么想法吗?

for (int i = 0; i < 20; i++) {
    Rain r = new Rain();
    r.start();
}

4 个答案:

答案 0 :(得分:4)

尝试将线程生成器作为线程运行,然后实现Thread.sleep(2000)

答案 1 :(得分:3)

你可能只是创建一个spawner线程,它在产生每个线程之间只能睡2秒:

for (int i = 0; i < 20; i++) {
    Rain r = new Rain();
    r.start();
    Thread.sleep(2000);
}

注意:遗漏了try-catch块

答案 2 :(得分:2)

如果由于您创建的线程数而遇到滞后,最佳解决方案可能是降低您创建的线程数。

此外,Java 5引入了执行程序服务框架,它在Java 7中再次使用fork / join进行了改进,因此在正常情况下你根本不必自己创建线程。 (Here是指向页面的链接,对这些概念有很好的解释。)

我通常不会启动比我在机器上有核心更多的线程,如下所示:

int availableThreads = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(availableThreads);

// ...Create List<Future<ReturnObject>>
// populate list by calling futures.add(executorService.submit(callable));

executorService.shutdown();

这是因为,只要在计算密集型过程中,当您在每个内核上同时进行计算而不是在单个内核上进行线程切换时,就会获得最大的线程增益。当然,当你谈论磁盘或网络密集的进程时,这会发生变化,但这是一个非常好的经验法则。

答案 3 :(得分:1)

我真的不明白为什么只有20个线程创建会滞后,但是如果你想让它们在不同的时间启动它们就可以暂停:

for (int i = 0; i < 20; i++) {
    Rain r = new Rain();
    r.start();
    Thread.sleep(2000);
}