在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秒。我知道这取决于我的硬件和操作系统配置,但我只是想知道在一定时间内创建多个线程的最佳方法是什么?
感谢。
答案 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毫秒 !!