Java 多线程 - return 语句花费太多时间

标签 java multithreading concurrency

在多线程(Executor 框架)中,x() 方法中所有时间打印的总和与 doPerform 打印的总时间不匹配。随着线程池中线程数量的增加,这种差异不断增大(最多 20 秒)。有人可以弄清楚为什么吗?有什么方法可以减少从 x 方法返回所需的时间吗?
我已经测试过:

a) 向执行者提交 500 份(池大小 = 100)
b) 500 个提交给执行者(池大小=300)
c) 向执行者提交 300 份内容(池大小 =100)

public void x() {
    long startTime = System.currentTimeMillis();
    for (long l = 0; l <= 10000000; l++) {
        if (l % 1000000 == 0) {
            System.out.println("Thread id: "
                    + Thread.currentThread().getId() + "\t"
                    + (System.currentTimeMillis() - startTime));
            startTime = System.currentTimeMillis();
        }
    }
}

public void doPerform() {
    long startTime = System.currentTimeMillis();
    x();
    System.out.println("Thread id: " + Thread.currentThread().getId()
            + "\t" + (System.currentTimeMillis() - startTime));
}

最佳答案

这是预期的。您有 100 或 300 个并行线程正在执行,并且只有 1、2 或 4 个核心来执行所有这些线程(除非您在巨型 super 计算机上运行)。这意味着每个线程都被分配了一些 CPU 时间,然后是其他线程,然后是其他线程,等等,给人一种并行执行的错觉。但实际上,各个线程的指令是交错顺序执行的。

因此,您可以在 doPerform() 中执行一个线程AstartTime 计算,然后该线程可以被 CPU 上的其他几个线程替换。在线程调度程序将 A 重新分配给 CPU 并执行 x() 中的 startTime 计算之前,可能会经过数毫秒。

关于Java 多线程 - return 语句花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14010155/

相关文章:

java - 如何压缩 URI 图像?

go - 在 channel 中使用rate.NewLimiter速率限制器

java - 迭代 ConcurrentHashMap 值线程安全吗?

java - 在使用 java.util.concurrent 类时,我应该同步以避免可见性问题吗?

java - 蓝牙连接失败 "java.io.IOException: read failed, socket might closed or timeout, read ret: -1"

java - 删除 JPanel 内的 JPanel... 在 JPanel 内

java - 错误 : parse xml using java

Java/Android : Socket closed when offloading work to a thread pool

python - 如何在 Python 线程池中使用初始化器

c - GUI 小部件多线程