3

我正在尝试对可以在单个 JVM 上运行的最大并发线程数以及创建大量线程所需的时间进行小测试。我有以下简单的代码

public class Threading {

  public static void main(String[] args) {
    Runnable task = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 100000; i++)
                ;
        }
    };

    long start = System.nanoTime();
    int runs = 1000000;
    for (int i = 0; i < runs; i++)
        new Thread(task).start();

    long time = System.nanoTime() - start;
     System.out.printf("Time for task to complete: %.2f seconds", (double) time / 1000000000.0);
 }
}

我正在使用 VisualVM 来跟踪活动线程的数量。

我得到的结果似乎很奇怪。我达到的峰值活动线程约为 100,平均活动线程数约为 15。创建 100 万个线程需要 60 多秒。

VisualVM 截图

我在这里做错什么了吗?

4

2 回答 2

5

从 0 计数到 100000 而不做任何其他事情是如此之快(甚至可能被 Hotspot 完全删除,将run()方法减少到 noop),您将永远不会有大量并发线程:开始一个新线程需要更多时间线程比线程完成和死亡所需的时间多。

为什么不让所有线程永远休眠?这将保证他们都开始了。

于 2013-04-09T11:57:48.360 回答
1

我在这里做错什么了吗?

不,我不这么认为,尽管这取决于您要完成的工作。

我看到的唯一问题是您的工作循环将在短的时间内完成。您的程序所花费的时间主要用于Thread创建而不是其他任何事情。

// this is going to take a couple ns at most
for (int i = 0; i < 100000; i++)
     ;

我会显着增加每个线程正在做的工作量,看看这是否更像你的预期。

一旦你增加了每个线程正在做的工作量,你很快就会发现你很可能会在你能够分叉 100 万个线程之前很久就用完线程的堆栈空间内存或某些操作系统限制。

于 2013-04-09T11:57:22.153 回答