Thread Synchronisation | Übung

Dit_

Bekanntes Mitglied
Hallo ich übe gerade Threadsynchronisation und eine Sache verstehe ich nicht ganz.

Ich setze den Thread T-Zaehler, methode
Code:
work()
als nicht Daemon und den Thread T-Stopper, methode
Code:
doit()
als Daemon.
Ich dachte der Daemon Thread stoppt sofort wenn main zu ende ist und somit wäre die variable stop nicht auf true gesetzt. Thread Z-Zaehler sollte doch dann endlos weiter laufen...
Wenn ich aber das programm ausführe bekomme ich folgendes:

main start
main ende
zaehle: 0
ich warte...
zaehle: 1
ich warte...
zaehle: 2
ich warte...
zaehle: 3
ich warte...
zaehle: 4
ich warte...
zaehle: 5
ich warte...
zaehle: 6
ich warte...
zaehle: 7
ich warte...
zaehle: 8
ich warte...
zaehle: 9

Kann jemand bitte erklären warum?

Java:
public class Synchronisation {
	
//	public  boolean stop = false;
//	public  int i = 0;
	
	public volatile boolean stop = false;
	public volatile int i = 0;
	
	public void work(){
		Thread th = new Thread("T-Zaehler"){
			@Override
			public void run() {
				while(!stop){
					System.out.println("zaehle: "+ i++);
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						//
					}
				}
			};
		};
		th.setDaemon(false);
		th.start();
	}
	
	public void doit(){
		Thread th = new Thread("T-Stopper"){
			@Override
			public void run() {
				while(i != 10){
					System.out.println("ich warte...");
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						//
					}
				}
				stop = true;
			};
		};
		th.setDaemon(true);
		th.start();
	}
	
	public static void main(String[] args) {
		System.out.println("main start");
		Synchronisation s = new Synchronisation();
		s.work();
		s.doit();
		System.out.println("main ende");
	}
}

Danke schon mal.
 
Ich dachte der Daemon Thread stoppt sofort wenn main zu ende ist
denken darf man, ist nur nicht richtig, ist ohne jede Begründung,
willst du noch erklären was dich dazu brachte damit man darauf eingehen kann?
ansonsten halt: nö, falsch

Daemon läuft, solange es aktive (User-)Threads gibt, von main an sich nicht abhängig
 
was sagt schon ein derartiges Zitat, kann sich doch auf einfache Programme beziehen wo eben zunächst nur mit main + Daemon hantiert wird,
die ISBN gehört übrigens zu 'SCJP - Sun Java Certified Programmer',

na wie auch immer, dann ist dieses Missverständnis ja jetzt geklärt, hier noch Zitat aus der API von Thread
public final void setDaemon(boolean on)

Marks this thread as either a daemon thread or a user thread. The Java Virtual Machine exits when the only threads running are all daemon threads.
 
was sagt schon ein derartiges Zitat, kann sich doch auf einfache Programme beziehen wo eben zunächst nur mit main + Daemon hantiert wird,
die ISBN gehört übrigens zu 'SCJP - Sun Java Certified Programmer',

Die Amazon-Rezensionen lassen nichts wirklich gutes hoffen bei dem Buch, ich würde mal schauen ob es nicht eine Errata gibt. Im SCJP Sun Certified Programmer for Java 6 Study Guide: Amazon.de: Katherine Sierra, Bert Bates: Englische Bücher steht es übrigens korrekt drin.

Ich möchte noch anmerken das man bei solchen Dingen wie "volatile int..." genau über die Semantik Bescheid wissen sollte. Die Semantik von volatile ist nämlich nicht stark genug damit "i++" atomar ausgeführt wird (was man meistens möchte), was hier kein Problem ist da die Variable nur von einem Thread geschrieben wird. Möchte man sicherstellen das Dekrementieren und Inkrementieren als atomare Operationen laufen muss man entweder selbst synchronisieren oder z.B. AtomicInteger verwenden.
 
Zuletzt bearbeitet:
Bin gerade auf Seite 350 und habe bis jetzt ca. 10 Schreibfehler enteckt, es handelt sich meisten um SchreibFehler:
Code:
System.out.println(einTextOhne"Zeichen");

Obwohl es um Java 6 handelt, steht im Kapitel ThreadsSynchronisation kein Wort über Locks.

Sonst bietet das Buch einen sehr guten API-Überblick.
 

Zurück
Oben