2

在 5 秒内创建 500.000 个线程的最佳方法是什么。(可运行)我创建了 for 循环,但它需要很多时间。例如;

startTime = System.currentTimeMills();

for (int i=0;i<500.000; i++){
 // create thread
  thread.start();
}

resultTime = (System.currentTimeMills() - startTime);

所以 resultTime 大于 5 秒。我知道这取决于我的硬件和操作系统配置,但我只想知道在特定时间创建多个线程的最佳方法是什么?

谢谢。

4

4 回答 4

8

我真的无法想象这是个好主意。每个线程占用合理数量的资源(默认情况下,每个线程占用 512k 堆),因此即使您创建了所有线程,您的 JVM 也会为资源而战。

如果您需要 500,000 个工作单元,我认为您最好将这些创建为Runnables(而不是一次全部!)并将它们传递给调整到您的 environment.machine 的ThreadPool(例如,天真/简单的调整将是每个 CPU 一个线程)

于 2012-11-06T15:54:07.177 回答
1

创建许多任务的最快方法是使用 ExecutorService

int processors = Runtime.getRuntime().availableProcessors();
ExecutorService es = Executors.newFixedThreadPool(processors);

long start = System.nanoTime();
int tasks = 500 * 1000;
for (int i = 0; i < tasks; i++) {
    es.execute(new Runnable() {
        @Override
        public void run() {
            // do something.
        }
    });
}
long time = System.nanoTime() - start;
System.out.printf("Took %.1f ms to create/submit %,d tasks%n", time / 1e6, tasks);
es.shutdown();

印刷

Took 143.6 ms to create/submit 500,000 tasks
于 2012-11-06T16:04:09.213 回答
0

也许这个期望你的电脑抽得更好:概念:在每个核心之间共享工作。

public class Example {

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            new Thread(new ThreadCreator()).start();  // with 4 cores on your processor
        }
    }


}

class ThreadCreator implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 125000; i++) {
            new Thread().start();         // each core creating remaining thread
        }
    }
}

只用了 0,6 毫秒

于 2012-11-06T16:06:37.830 回答
0

也许您可以制作几个特殊线程,每个线程生成 250000 个线程。

于 2012-11-06T15:56:44.137 回答