1

マルチスレッド(Executorフレームワーク)では、x()メソッド内のすべてのタイムプリントの合計が、doPerformによってプリントされた合計時間と一致しません。そして、この違いは、スレッドプール内のスレッド数が増えるにつれて大きくなり続けます(最大20秒になります)。誰かが理由を理解できますか?そして、xメソッドから戻るのにかかる時間を短縮する方法はありますか?
私はそれを次のようにテストしました:

a)エグゼキュータへの500件の提出(poolsize = 100)
b)エグゼキュータへの500件の提出(poolsize = 300)
c)エグゼキュータへの300件の提出(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 に答える