Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Threads find ich (noch :lol: ) was extrem komplexes ???:L
Wenn man sagen wir mal einen Thread (ne Uhr) laufen lässt und dann versichern möchte, dass man trotzdem alles auf dem GUI währenddessen anklicken kann, dann muss man bei der Uhr immer ein Thread.sleep() bereitstellen oder nicht? Weil sonst hätte das GUI ja keine Zeit für "sich" übrig? Oder ist es umgekehrt, oder gar bei beiden?
Threads sollen ja eine Parallelität simulieren.
Du must einen Thread nicht anhalten damit ein andere zum Zuge kommt. Das ist ja der Sinn von Threads. Wichtig ist nur, das du dem Thread der dir am wichtigsten ist die grösste Priorität einräumst. Die geht von Prio 1 (kleine Prio) bis Prio 10 (grosse Prio).
2 Threads gleicher Priorität teilen sich also die verfügbare Rechenzeit.
Ah ok, das hab ich mal geschnallt.
Aber jetzt bin ich noch zu einem Beispiel gekommen. Da programmiert man so was ähnliches wie so ein "Bestellprogramm" für ein Kaffee. Der Kellner nimmt ne Bestellung entgegen, das wird dargestellt was er gerade entgegengenommen hat, dann gehts 5 Sekunden, bis es auch in der Warteschlange des Kochs erscheint (5 Sekunden für den Gang in die Küche ).
Die neuen Bestellungen und auch die Beedingung eines Auftrags des Kochs, kann man mittels Buttons steuern. Ich skizziere mal den Ablauf bis zu meinem Problem.
Man drückt nen Button in der Klasse Cafe -> Methode notifyEvent in der Klasse Order wird angesprochen
Order -> Der Kellner aus der Klasse Waiter ist am Warten (in der Methode waitForEvent von Order) bis eine Bestellung eintrifft. Durch das drücken eines Buttons wird in der Klasse Order die Methode waitForEvent aus dem Schlaf geweckt mittels notify() und liefert nun als Rückgabewert die neue Bestellung an den Waiter.
Der Koch ist ebenfalls in der Klasse Queue am Warten und zwar in der Methode remove. Wenn nun eine Bestellung beim waiter eingeht, dann wird automatisch queue.enter(neueBestellung) aufgerufen. Nun kommt der Code von der Klasse Queue:
Code:
class Queue {
private TextArea display;
private String[] queue = new String[5];
private int count = 0;
public Queue(TextArea display){
this.display = display;
}
public synchronized void enter(String item){
queue[count] = item;
count++;
display();
notify();
}
public synchronized String remove(){
while(count == 0){
try{
wait();
}
catch(InterruptedException e){
System.err.println("Sleep exception");
}
}
String item = queue[0];
count--;
for(int c = 0; c < count; c++){
queue[c] = queue[c+1];
}
display();
return item; //das wird an den Koch zurückgeliefert, der ja wartet
private void display(){
display.setText("QUEUE\n");
for(int c = 0; c < count; c++){
display.append(queue[c] + "\n");
}
}
}
Den ganzen Code möchte ich euch nicht antun, weil das einfach zu lange ist. Aber ich hoffe alles ist bisschen verständlich.
Was ich nun nicht kapiere: Der Koch stellt ja erst ein Menü fertig, wenn man auf nen Button drückt. Nun die erste Bestellung ist mir klar. Man drückt auf nen Button, übergibts so dem wartenden Waiter und der fügts in die Queue. Nun wacht die Methode remove durch das notify() auf und liefert dem Koch die erste Bestellung. Wenn man jetzt aber noch was bestellt (also alles funktioniert, ist ja aus einem Buch...), dann verstehe ich die Methode remove eben nicht mehr. Weil dann sind ja mehrere Dinge in der Queue, aber der Koch ist ja nicht mehr am warten weil count nicht mehr 0 ist. Nun müsste doch die Methode remove dauernd dem Koch neue Mahlzeiten übergeben, das passiert aber eben nicht, sondern die neuen Bestellung verbleiben in der Queue bis man die Fertigstellung einer Mahlzeit mitteilt.
Wieso??? Für mich macht die Schleife while(count == 0) darum einfach keinen Sinn.
(HOffe das war alles verständlich..)
----------------------------------------------------------------------------
EDIT (NACHTRAG ZUR 1. FRAGE):
@Illuvatar:
Dann ist meine Annahme also richtig, dass man durch Thread.sleep() den anderen immer noch etwas Zeit einräumt right? Wie lange wählt ihr denn diese sleep-time jeweils?
eben, das ist ja das problem weil die Schleife in der Queue schläft nur, solange count==0 ist, wenn jetzt aber count eben inkrementiert wird, dann wächt ja die Methode remove wieder auf -> gibt dem Koch etwas zurück was er nicht erwartet (zumindest nicht solange er noch am Kochen des anderen ist). Blickt da jemand durch?
[...]Wenn man sagen wir mal einen Thread (ne Uhr) laufen lässt und dann versichern möchte, dass man trotzdem alles auf dem GUI währenddessen anklicken kann, dann muss man bei der Uhr immer ein Thread.sleep() bereitstellen oder nicht? Weil sonst hätte das GUI ja keine Zeit für "sich" übrig? Oder ist es umgekehrt, oder gar bei beiden?[...]
Prinzipiel ist es so: Die Oberfläche läuft in einem Thread (bzw. sogar mehrere). Führst Du in diesem Thread - vielleicht noch in einer Schleife - irgendwelche andere Sachen aus (zum Beispiel in einem Listener eines Buttons), kann dieser Thread sich natürlich nicht mehr um andere Dinge kümmern. Thread.sleep() brauchst Du nur, wenn Dein Thread eine bestimmte Zeit "schlafen" sprich pausieren soll. Die Umschaltung zwischen den Threads übernimmt die Java VM in Abhängig zur Thread-Priorität.
Ganz kapiert habe ich das noch nicht sorry: Also das heisst, wenn in der GUI Klasse in einer Schleife noch ein anderen Thread läuft dann müsste ich in dem zusätzlichen Thread ein Thread.sleep bereitstellen damit das GUI immer noch Zeit hat? Aber andere Threads laufen ja immer irgendwie in der GUI Klasse?!
Ganz kapiert habe ich das noch nicht sorry: Also das heisst, wenn in der GUI Klasse in einer Schleife noch ein anderen Thread läuft dann müsste ich in dem zusätzlichen Thread ein Thread.sleep bereitstellen damit das GUI immer noch Zeit hat? Aber andere Threads laufen ja immer irgendwie in der GUI Klasse?!
Wenn in einer GUI Klasse ein anderer Thread läuft? Wie soll das den gehen? Du kannst allerhöchstens in der GUI Klasse einen anderen Thread starten.
Und wenn Du einen weiteren Thread hast, der die Schleife beinhaltet, kann ja der ursprüngliche Thread die GUI aktualisieren. Und dann brauchst Du auch kein Thread.sleep();.
Hast Du die Schleife jedoch nicht einem extra Thread, sondern lässt dies vom GUI Thread bearbeiten, hilft auch ein Thread.sleep(); nichts: Dann macht ja der GUI Thread nur eine Pause. Aber er kommt trotzdem nicht zum Aktualisieren der Oberfläche.
Danke dir, jetzt kapier ichs. Und dieses Onlinebuch find ich sogar noch besser als das www.javabuch.de. Ist viel zu kompliziert für jemanden mit keinem oder wenig Erfahrung.