【问题标题】:Why is thread creation considered an expensive process? [duplicate]为什么线程创建被认为是一个昂贵的过程? [复制]
【发布时间】:2014-05-19 07:31:32
【问题描述】:

我正在阅读有关线程池的信息,发现线程创建被认为是一个昂贵的过程。这抵消了我的直觉,我决定对其进行测试:

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < 1000; i++) {
        new Thread(new Runnable() {
            @Override
            public void run() {
            }
        }).start();
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start + "ms");
}

这会在我的系统上打印696ms。所以创建一个线程的时间接近0.69毫秒。为什么这被认为很慢?

编辑:

public class Test {
    static int a = 1;
    static long start;
    static void setA() {
        ++a;
        if(a>=1000) {
            long end = System.currentTimeMillis();
            System.out.println(end - start + "ms");
        }
    }

    public static void main(String[] args) {
        start = System.currentTimeMillis();
        for (int i = 0; i <= 1000; ++i) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    setA();
                }
            }).start();
        }
    }
}

这打印729ms

【问题讨论】:

  • 好吧,你只测量了主线程所花费的时间。您还没有等待线程真正开始......另外,一毫秒在计算中是相当长的时间。
  • @JonSkeet 请查看修改后的代码。会说现在开始考虑的实际时间?
  • @JonSkeet Also, a millisecond is a pretty long time 如果我有 100 个线程,我会通过转换为线程池来保存 100ms。对我来说,这种优化对大多数企业应用程序没有意义。
  • @KshitizSharma:这取决于 - 如果您正在考虑在服务器中为每个请求创建一个新线程,那么您基本上是在说每秒处理 1000 个请求,您将花费 所有创建线程的时间。

标签: java multithreading performance threadpool


【解决方案1】:

速度慢的原因有几个。首先,start方法调用的是native方法,native调用总是很慢。那么,创建线程就是一个内核函数(为它分配内存,添加到调度器中),所以程序必须等待线程真正被创建。

【讨论】:

  • 这解释了它们是如何在内部工作的,而不是为什么 0.72 ms 线程被认为很慢。
  • 嗯,一般不认为慢,但你必须注意你这样做的目的。例如。如果不是真的需要,创建一个线程只是为了让计算运行线程没有任何意义..
  • 你能引用一些原生方法调用慢的统计数据吗? JVM 一直在进行本地调用,所以我认为这不是真的。
  • 调用本身很“慢”,因为VM在调用该方法之前必须做一些步骤:在VM堆栈上创建一个本机框架,添加Java代码推送的参数(其中正在调用本机方法)作为对该本机框架的本地引用,还将值推送到本机堆栈上,CALL 进入本机方法,清理堆栈,然后使用其本地引用释放本机 VM 框架。 Source 是我和我的一个朋友正在开发的虚拟机。
【解决方案2】:

当人们谈论线程创建缓慢时,通常与线程正在执行的工作量有关。

尝试对计算任务进行基准测试,例如将100 数字相加,并比较创建线程所需的时间(一旦您可以准确测量)。

【讨论】:

  • 这是最好的答案。 “......相对于线程正在做的工作量。”如果您的程序花费数百毫秒来创建一个只完成几微秒工作的线程,那么您可能应该为您的问题寻找更有效的解决方案。
【解决方案3】:

每次在程序中创建线程时,虚拟机(VM)和操作系统都必须分配一堆数据结构来跟踪这些线程之间的执行和上下文切换。例如,每个线程都会有自己的堆栈、它的局部变量、线程局部变量等等。如果是绿色线程,VM 将分配和管理这些数据结构。如果是本机线程,操作系统将管理它们。无论哪种情况,您最终都会分配系统资源来管理线程。这就是为什么创建一个线程需要一点时间并且创建大量线程可能会消耗大量系统资源的原因。

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2012-09-28
    • 2017-10-12
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多