Threads und .join

Diskutiere Threads und .join im Java Basics - Anfänger-Themen Bereich.
A

arhzz

Java:
public class print extends Thread {

public void run() {
    Out.print("Hello");
    Out.println("World");
}
}
public class test {
    public static void main (String[] args) {
        Thread t1 = new print();
        Thread t2 = new print();
        Thread t3 = new print();
        Thread t4 = new print();
        Thread t5 = new print();
        
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
        
        try {
            t1.join();
            t2.join();
            t3.join();
            t4.join();
            t5.join();
        }catch(InterruptedException e) {
        }
    }
}
Hallo! In diesem code habe ich das Problem dass die Ausgabe nicht konsistent ist. Die Idee ist dass ich Hello in einer Linie und World in eine neue Linie ausgebe. Manchmal ist die ausgabe richtig.Woran liegt dass "problem"? Der Code:
 
L

LimDul

Du hast 5 Threads die grob aus folgenden zwei Schritten bestehen

Gibt Hello Aus
Gib World + NewLine aus

Machen wir das mal für 2 Threads:

Thread 1:
a1) Gibt Hello Aus
a2) Gib World + NewLine aus

Thread 2:
b1) Gibt Hello Aus
b2) Gib World + NewLine aus

Einzige Garantie die du hast a2 wird nach a1 ausgeführt und b2 nach b1 - aber über die Reihenfolge von a und b gibt es keine Aussage das heißt, die Reihenfolge kann sein:

a1, a2, b1, b2
a1, b1, a2, b2
a1, b1, b2, a2
usw.
 
A

arhzz

Du hast 5 Threads die grob aus folgenden zwei Schritten bestehen

Gibt Hello Aus
Gib World + NewLine aus

Machen wir das mal für 2 Threads:

Thread 1:
a1) Gibt Hello Aus
a2) Gib World + NewLine aus

Thread 2:
b1) Gibt Hello Aus
b2) Gib World + NewLine aus

Einzige Garantie die du hast a2 wird nach a1 ausgeführt und b2 nach b1 - aber über die Reihenfolge von a und b gibt es keine Aussage das heißt, die Reihenfolge kann sein:

a1, a2, b1, b2
a1, b1, a2, b2
a1, b1, b2, a2
usw.
Hmmmm, ja dass macht sinn.Wie kann ich die Reihenfolge bestimmen? Soll ich diese .join ein bisschen adaptieren?
 
L

LimDul

Dann musst du dafür sorgen, dass das was ich mit a1, a2, b1, b2 bezeichnet habe entsprechend mit Dingen, die ihr behandelt haben, synchronisiert werden, dass die korrekte Reihenfolge rauskommt
 
J

JustNobody

Was du wahrscheinlich sehen sollst bei dieser Übung ist, dass die Threads alle in den gleichen Stream schreiben und das Ergebnis daher entsprechend durchgewürfelt ist.

Jeder thread will schreiben:
helloworld!

Aber da es in zwei Teilen geschrieben wird, kommt es so Dingen wie:
Thread 1 schreibt "hello"
Thread 2 schreibt "hello"
Thread 1 schreibt "world\n"
Thread 3 schreibt "hello";
Thread 3 schreibt "world\n"
Thread 2 schreibt "world\n"

Somit sieht das Ergebnis so aus:

hellohelloworld
helloworld
world

Die Threads bearbeiten ihre Aufgaben halt so schnell sie können. Bei mir kommt übrigens meistens ein sauberes helloworld raus - nur hin und wieder kommt ein Thread einem anderen in die Quere. Dürfte daran liegen, das das starten eines Threads auch etwas Zeit braucht und in der Zeit hat der vorherige Thread die Ausgabe erledigt.

Das wäre, was man daran etwas erkennen könnte...

Ansonsten würde mich interessieren, was Du genau als Ausgabe erwartest und was du genau bekommst. "hello" und "world" jeweils auf eine Zeile sehe ich hier nicht...
 
A

arhzz

Was du wahrscheinlich sehen sollst bei dieser Übung ist, dass die Threads alle in den gleichen Stream schreiben und das Ergebnis daher entsprechend durchgewürfelt ist.

Jeder thread will schreiben:
helloworld!

Aber da es in zwei Teilen geschrieben wird, kommt es so Dingen wie:
Thread 1 schreibt "hello"
Thread 2 schreibt "hello"
Thread 1 schreibt "world\n"
Thread 3 schreibt "hello";
Thread 3 schreibt "world\n"
Thread 2 schreibt "world\n"

Somit sieht das Ergebnis so aus:

hellohelloworld
helloworld
world

Die Threads bearbeiten ihre Aufgaben halt so schnell sie können. Bei mir kommt übrigens meistens ein sauberes helloworld raus - nur hin und wieder kommt ein Thread einem anderen in die Quere. Dürfte daran liegen, das das starten eines Threads auch etwas Zeit braucht und in der Zeit hat der vorherige Thread die Ausgabe erledigt.

Das wäre, was man daran etwas erkennen könnte...

Ansonsten würde mich interessieren, was Du genau als Ausgabe erwartest und was du genau bekommst. "hello" und "world" jeweils auf eine Zeile sehe ich hier nicht...
Also die Aufgabe sagt dass ich den Satz in zwei teilen soll, erste teil print für hello und println für world. Dann soll ich das Programm ofter testen und dass Problem beschreiben.Und dann soll ich dass Programm änderen so dass die nächsten Threads erst dann starten,wenn der vorhegirige thread beendet wurde.
 
Kirby_Sike

Kirby_Sike

Java:
public static void main (String[] args) {
        Thread threads[] = new Thread[5];
        for(int i = 0; i < threads.length; i++) {
            threads[i] = new print();
        }
        int check = 0;
        for(int i = 0; i < threads.length; i++) {
            threads[i].start();
            try {
                threads[i].join();
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
Damit solltest du dein Ergebnis erzielen ;)
 
Zuletzt bearbeitet:
A

arhzz

Java:
public static void main (String[] args) {
        Thread threads[] = new Thread[5];
        for(int i = 0; i < threads.length; i++) {
            threads[i] = new print();
        }
        int check = 0;
        for(int i = 0; i < threads.length; i++) {
            threads[i].start();
            try {
                threads[i].join();
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
Damit solltest du dein Ergebnis erzielen ;)
Danke dir!
 
A

arhzz

Hast Du das denn gemacht? Ist dir etwas aufgefallen? Kannst Du das beschreiben? Hast Du verstanden, wodurch das Problem entstanden ist?
Ja, ich habe so ein änliches Beispiel gefunden wo alles beschrieben ist und erklart.Ich habe es auch verstanden, und in meinen eigen Wortern beschrieben mit Code-Kommentaren.
 
F

fhoffmann

Als Übung in einer Java-Schulung mag dies ja angehen.
Es ist aber eigentlich nicht der Sinn von Threads, erst einen zu starten und anschließend zu warten, bis er fertig ist, um dann den nächsten Thread zu starten. Dann könnte man auch ohne Threads arbeiten.
Threads sollen ja gerade gleichzeitig arbeiten; und dann muss man das Problem, dass ihre Ausgaben durcheinander geschrieben werden, anders lösen.
 
Thema: 

Threads und .join

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben