Servicezeiten direkt proportional zur Anzahl der Threads

Mein System ist i5-Dual Core mit Hyper-Threading. Windows zeigt mir 4 Prozessoren. Wenn ich eine einzelne optimierte CPU-gebundene Aufgabe durch einen einzelnen Thread auf einmal laufen lasse, zeigt seine Servicezeit immer ungefähr 35ms an. Aber wenn ich 2 Aufgaben an 2 Threads gleichzeitig übergebe, werden deren Servicezeiten um die 70ms angezeigt. Ich möchte fragen, ob mein System 4 Prozessoren hat. Warum liegen die Servicezeiten dann bei etwa 70, wenn 2 Threads ihre Tasks ausführen, während 2 Threads auf 2 Prozessoren ohne zeitlichen Aufwand ausgeführt werden sollten. Die Codes lauten wie folgt:

CPU-gebundene Aufgabe lautet wie folgt.

import java.math.BigInteger;

public class CpuBoundJob  implements Runnable {

    public void run() {

         BigInteger factValue = BigInteger.ONE;
            long t1=System.nanoTime();

            for ( int i = 2; i <= 2000; i++){
              factValue = factValue.multiply(BigInteger.valueOf(i));
            }
        long t2=System.nanoTime();

        System.out.println("Service Time(ms)="+((double)(t2-t1)/1000000));
    }

}

Thread, der eine Aufgabe ausführt, lautet wie folgt:

public class TaskRunner extends Thread {
    CpuBoundJob job=new CpuBoundJob();
    public void run(){

        job.run();
    }
}

nd schließlich ist die Hauptklasse wie folg

public class Test2 {
int numberOfThreads=100;//warmup code for JIT
public Test2(){
    for(int i=1;i<=numberOfThreads;i++){//warmup code for JIT
        TaskRunner t=new TaskRunner();
        t.start();
        }
    try{
    Thread.sleep(5000);// wait a little bit
    }catch(Exception e){}
    System.out.println("Warmed up completed! now start benchmarking");
    System.out.println("First run single thread at a time");

    try{//wait for the thread to complete
        Thread.sleep(5000);
        }catch(Exception e){}
        //run only one thread at a time
            TaskRunner t1=new TaskRunner();
            t1.start();


    try{//wait for the thread to complete
        Thread.sleep(5000);
        }catch(Exception e){}

    //Now run 2 threads simultanously at a time

    System.out.println("Now run 3 thread at a time");


        for(int i=1;i<=3;i++){//run 2 thread at a time
            TaskRunner t2=new TaskRunner();
            t2.start();


            }


}
public static void main(String[] args) {
    new Test2();    
    }

Endausgabe:

ufgewärmt abgeschlossen! Starten Sie jetzt das Benchmarking. Führen Sie zuerst einen einzelnen Thread gleichzeitig aus. Service Time (ms) = 5.829112 Führen Sie jetzt 2 Threads gleichzeitig aus. Service Time (ms) = 6.518721 Service Time (ms) = 10.364269 Service Time (ms) = 10.272689

Antworten auf die Frage(4)

Ihre Antwort auf die Frage