Einfluss von System.out auf Programm

HerrJemineh

Mitglied
Hallo Liebe Java-Gemeinde 🙂
Seit neuestem habe ich es mit einem Phänomen zu tun, was mir noch nie vorher begegnet ist und welches ich nicht erklären kann. Vielleicht stehe ich aber auf einfach wie ein Ochs vorm Berg und ihr könnt mir helfen.

Ich habe folgende 2 kleine Codes:

Java:
import java.util.LinkedList;
import java.util.Queue;

public class Main {
	
	public static Queue<String> schlange = new LinkedList<String>();

	public static void main(String[] args) {
		QueueWriter schlangenfueller = new QueueWriter();
		Thread t1 = new Thread(schlangenfueller);
		t1.start();
		System.out.println(schlange.size());
		while(!schlange.isEmpty()){
			String ausgabe = schlange.poll();
			System.out.println(ausgabe);
		}
	}

}

Und diesen hier:

Java:
public class QueueWriter implements Runnable {

	@Override
	public void run() {
		Main.schlange.add("Die");
		Main.schlange.add("Schlange");
		Main.schlange.add("wird");
		Main.schlange.add("immer");
		Main.schlange.add("voller.");
	}
}

2 Probleme: 1.) Lasse ich das Programm so laufen, wird "0 Die Schlange wird immer voller." ausgegeben.
Warum 0 ? Es müsste doch 5 sein?! 2.) Kommentiere ich die Zeile
Java:
System.out.println(schlange.size());
jedoch aus, wird NICHTS ausgegeben.

Kann mir das jemand erklären? Ich wäre sehr dankbar! 🙂

EDIT: Ich habe die Vermutung dass der Thread zu lange braucht und das sysout in der Main vorher gemacht wird, richtig?
 
Zuletzt bearbeitet:
Wenn du die JRE nur auf einer CPU laufen lässt, wird diese sicherlich noch andere Ergebnisse ausgeben. Mit Thread.start() wird zwar der Thread "gestartet" ABER es wird nicht garantiert, dass die JRE die Anweisungen in deinem Thread sofort bearbeitet.

Thread1: t1.start();
Thread1: System.out.println(schlange.size());
Thread2: Main.schlange.add("Die");
Thread2: Main.schlange.add("Schlange");
Thread2: Main.schlange.add("wird");
Thread2: Main.schlange.add("immer");
Thread2: Main.schlange.add("voller.");
Thread1: while ....

Darum passiert auch nichts:

Thread1: t1.start();
Thread1: while ....
Thread2: Main.schlange.add("Die");
Thread2: Main.schlange.add("Schlange");
Thread2: Main.schlange.add("wird");
Thread2: Main.schlange.add("immer");
Thread2: Main.schlange.add("voller.");

Kannst es auch mit folgenden Code ausprobieren:

Java:
    public static void main(String[] args) {
        QueueWriter schlangenfueller = new QueueWriter();
        Thread t1 = new Thread(schlangenfueller);
        t1.start();
        while(schlange.isEmpty()){}
        while(!schlange.isEmpty()){
            String ausgabe = schlange.poll();
            System.out.println(ausgabe);
        }
    }

PS: Selbstverständlich sind auch solche Konstellationen möglich:

Thread1: t1.start();
Thread2: Main.schlange.add("Die");
Thread2: Main.schlange.add("Schlange");
Thread2: Main.schlange.add("wird");
Thread1: while ....
Thread2: Main.schlange.add("immer");
Thread2: Main.schlange.add("voller.");
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben