2

我正在生成 20 个线程(它们都应该同时运行)。但是,它们都是同时创建的,而且都是同时开始运行的,这就给整个程序带来了很大的滞后(这是滞后,我的电脑并不慢)。

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

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

4 回答 4

4

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

于 2012-04-04T20:13:08.310 回答
3

您可能只创建一个生成器线程,它在生成每个线程之间仅休眠 2 秒:

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

注意:省略了 try-catch 块

于 2012-04-04T20:16:41.860 回答
2

如果由于创建的线程数而出现延迟,最好的解决方案可能是减少创建的线程数。

此外,Java 5 引入了执行器服务框架,在 Java 7 中通过 fork/joins 再次对其进行了改进,因此在正常情况下您根本不必自己创建线程。(这里是一个页面链接,对这些概念有很好的解释。)

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

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();

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

于 2012-04-05T00:30:05.273 回答
1

我真的不明白为什么它会因为只创建 20 个线程而滞后,但如果你希望它们在不同时间启动,你可以休眠:

for (int i = 0; i < 20; i++) {
    Rain r = new Rain();
    r.start();
    Thread.sleep(2000);
}
于 2012-04-04T20:14:49.910 回答