Threads Threads laufen sequenziell, statt gleichzeitig.

ml528

Mitglied
Hallo Leute,
Ich versuche seid vielen Stunden zwei Threads gleichzeitig laufen zu lassen, jedoch zeigt mir der Editor eine sequenzielle Abfolge der Ausgaben. Außerdem möchte ich die benötigte Zeit für die Ausführung des Codes dokumentieren, deswegen die Methode currentTimeMillis. Um gleich auf den Punkte zu kommen, zeige ich euch meinen Code.
Ich habe eine Klasse, die mit der run()-Methode:

Java:
public class ZahlenAddieren extends Thread {
  
    int x = 5;
    int y = 50000000;
    public void run () {
        final long timeStart = System.currentTimeMillis();
      
        while(x<40) {
            System.out.println(x+y);
            x++;
        }
        final long timeEnd = System.currentTimeMillis();
        System.out.println("Verlaufszeit der Schleife: " + (timeEnd - timeStart) + " Millisek.");
       }
      
}


Java:
public class Multithreading {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
ZahlenAddieren O = new ZahlenAddieren() ;
ZahlenAddieren P = new ZahlenAddieren() ;
final long timeStart = System.currentTimeMillis();
O.start();
P.start();
final long timeEnd = System.currentTimeMillis();
System.out.println("Verlaufszeit der Schleife: " + (timeEnd - timeStart) + " Millisek.");
    }
}


Wenn ich die Main-Methode aufrufe, kommt die folge Ausgabe:

Java:
Verlaufszeit der Schleife: 0 Millisek.
50000005
50000006
50000007
50000008
50000009
50000010
50000011
50000012
50000013
50000014
50000015
50000016
50000017
50000018
50000019
50000020
50000021
50000022
50000023
50000024
50000025
50000026
50000027
50000028
50000029
50000030
50000031
50000032
50000033
50000034
50000035
50000036
50000037
50000038
50000039
50000005
50000006
50000007
50000008
50000009
50000010
50000011
50000012
50000013
50000014
50000015
50000016
50000017
50000018
50000019
50000020
50000021
50000022
50000023
50000024
50000025
50000026
50000027
50000028
50000029
50000030
50000031
50000032
50000033
50000034
50000035
50000036
50000037
50000038
50000039
Verlaufszeit der Schleife: 1006 Millisek.
Verlaufszeit der Schleife: 1023 Millisek.

Wie ihr sehen könnt, ist die Ausgabe sequenziell.
Was kann ich machen, um die Ausgabe parallel zu starten?
 
Danke Robat 😀 Hat geklappt 🙂
Könntest du mir vlt. noch erklären, warum man den Code, den du mir gesagt hast, in der Schleife ausführen muss?
 
Hast du denn ne Idee, warum die kurze Verzögerung überhaupt hilft?
Ja. Durch die Verzögerung hat der zweite Thread die Möglichkeit, den Code ebenfalls auszuführen. Gibt es vielleicht eine Möglichkeit die Threads in echter Parallelität ausführen zu lassen? Weil durch die Sleep-Methode haben wir eine Quasi- Parallelität merk ich gerade, also eine Abwechslung oder?
 
Du hast echte Parallelität, einfach zu wenig Arbeit, bzw ist sie zu schnell erledigt.
Das komische ist, dass die Rechnung mit 2 Threads länger brauch, als ein Thread, welches nicht parallel arbeitet. Ich hab dazu diesen EinzelThread gemacht :
Java:
public class ZahlenAddierenAlleine {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        final long timeStart = System.currentTimeMillis();
        int x = 5;
        int y = 50000000;
        int z = 5;
        int    a =    50000000;
      
        while(x<40) {
            System.out.println(x+y);
            x++;}
        while(z<40) {
            System.out.println(z+a);
            z++;}
          
            final long timeEnd = System.currentTimeMillis();
            System.out.println("Verlaufszeit der Schleife: " + (timeEnd - timeStart) + " Millisek.");
  
  
  

}
  
}

Im Prinzip wird das selbe wie bei Threads, aber die Ausgabe braucht weniger:
Nur 4 Millisekunden
Mit dem Code von ganz oben, also mit 2 Threads dauert es 41 Millisekunden.Eigentlich sollte es doch durch die Parallelität schneller vorangehen. Kennt ihr vielleicht den Grund? :/
 
Threads haben sehr viel mehr Overhead als 2 mal die gleiche Schleife laufen zu lassen. Dazu kommt noch der JIT-Compiler, der dass noch ein wenig schneller vorantreibt.
Aber wichtig ist: Threads sind teuer in der Verwendung und du brauchst schon eine signifikante Last, also nur 2 Schleifen, damit sie sich bewähren.
 
Threads haben sehr viel mehr Overhead als 2 mal die gleiche Schleife laufen zu lassen. Dazu kommt noch der JIT-Compiler, der dass noch ein wenig schneller vorantreibt.
Aber wichtig ist: Threads sind teuer in der Verwendung und du brauchst schon eine signifikante Last, also nur 2 Schleifen, damit sie sich bewähren.
Danke für deine Antwort 😀 Meintest du in deinem letzten Satz " ...,also NICHT nur 2 Schleifen..." ?
 

Zurück
Oben