Java多线程 - 返回语句花费了太多时间

时间:2012-12-23 10:13:52

标签: java multithreading concurrency

在多线程(Executor框架)中,x()方法中所有时间打印的总和与doPerform打印的总时间不匹配。随着线程池中线程数量的增加(最多20秒),这种差异会继续增长。有人可以找出原因吗?有没有办法减少从x方法返回的时间?
我测试过:

a)向遗嘱执行人提交的500份文件(poolize = 100)
b)向遗嘱执行人提交的500份文件(poolize = 300)
c)向遗嘱执行人提交的300份文件(poolize = 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));
}

1 个答案:

答案 0 :(得分:1)

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

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