1

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

a)500 次提交给 executor(poolsize =100)
b)500 次提交给 executor(poolsize =300)
c)300 次提交给 executor(poolsize =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));
}
4

1 回答 1

1

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

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

于 2012-12-23T10:24:27.333 回答