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 秒を超えています。ハードウェアとOSの構成に依存することはわかっていますが、特定の時間に複数のスレッドを作成する最良の方法は何ですか?

ありがとう。

4

4 に答える 4

8

これが良い考えだとは本当に想像できません。各スレッドは妥当な量のリソース (デフォルトでは、スレッドごとに 512k のヒープ) を使用するため、すべてのスレッドを作成したとしても、JVM はリソースを奪い合います。

500,000 の作業単位が必要な場合は、これらを s として作成し(一度にすべてではなく!)、environment.machine に合わせて調整されたThreadPoolRunnableに渡す方がよいと思います(たとえば、素朴な/単純な調整は次のようになります)。 CPU ごとに 1 つのスレッド)

于 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

たぶん、それぞれ250000スレッドを生成する特別なスレッドをいくつか作成できます..

于 2012-11-06T15:56:44.137 に答える
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 に答える