在特定时间为Java创建多个线程

时间:2012-11-06 15:50:01

标签: java multithreading runnable

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

startTime = System.currentTimeMills();

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

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

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

感谢。

4 个答案:

答案 0 :(得分:8)

我真的无法想象这是一个好主意。每个线程占用一定量的资源(默认情况下,每个线程有512k的堆),因此即使你创建了所有线程,你的JVM也会争夺资源。

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

答案 1 :(得分: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

答案 2 :(得分:0)

也许你可以创建一些特殊的线程,每个线程产生250000个线程..

答案 3 :(得分: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毫秒 !!