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
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',
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.