Thread.sleep

Status
Nicht offen für weitere Antworten.

A3XX

Bekanntes Mitglied
Hi

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?

Das kapier ich einfach nicht ganz :oops:
 

Isaac

Bekanntes Mitglied
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.
 

Illuvatar

Top Contributor
Aber wenn ein Thread die gesamte CPU beansprucht, können die anderen nix mehr machen, deshalb: in Schleifen in Threads sleep einbauen.
 

A3XX

Bekanntes Mitglied
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?
 

Isaac

Bekanntes Mitglied
Hmm, ganz schlau bin ich daraus nun nicht geworden aber in der Methode enter wird doch count inkrementiert. Ist also wieder > 0.
 

A3XX

Bekanntes Mitglied
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?
 

Grizzly

Top Contributor
A3XX hat gesagt.:
[...]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.
 

A3XX

Bekanntes Mitglied
@Grizzly

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?!
 

Grizzly

Top Contributor
A3XX hat gesagt.:
@Grizzly

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.

Ich denke, Du solltest Dir mal etwas Grundwissen über Threads aneignen. Siehe dazu: Java ist auch eine Insel Kapitel 9: Threads und nebenläufige Programmierung.
 

A3XX

Bekanntes Mitglied
HI again

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.

Thx
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Thread.sleep() Java Basics - Anfänger-Themen 5
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
P Threads Thread.sleep() Java Basics - Anfänger-Themen 7
M Fehler bei Thread.sleep() Java Basics - Anfänger-Themen 5
B Thread.sleep() Java Basics - Anfänger-Themen 1
C Thread.sleep ratsam? Java Basics - Anfänger-Themen 6
L Thread.sleep Java Basics - Anfänger-Themen 6
G problem mit thread.sleep() Java Basics - Anfänger-Themen 6
M Threads Thread.Sleep Problem im Zusammenhang mit GUI/ActionPerformed-Methode Java Basics - Anfänger-Themen 4
T Thread Sleep() Java Basics - Anfänger-Themen 4
J Thread.sleep Java Basics - Anfänger-Themen 7
A Thread.sleep() unterbrechen? Java Basics - Anfänger-Themen 3
S Thread.sleep () - Frage Java Basics - Anfänger-Themen 16
M Frage zur Methode Thread.sleep() Java Basics - Anfänger-Themen 6
O Memory Thread.sleep() Java Basics - Anfänger-Themen 5
G Problem mit Thread Sleep! Java Basics - Anfänger-Themen 3
S Thread.sleep i.V.m Button.setText() Java Basics - Anfänger-Themen 8
G Schleife mit Thread.sleep pausieren Java Basics - Anfänger-Themen 12
R Thread - sleep - interrupt Java Basics - Anfänger-Themen 18
M Thread.sleep(20) dauert 31ms ? Java Basics - Anfänger-Themen 7
E Anfänger Problem mit Thread.sleep() Java Basics - Anfänger-Themen 11
S Thread.sleep Java Basics - Anfänger-Themen 6
V Alternative zu Thread.sleep() ? Java Basics - Anfänger-Themen 6
S Runtime.exec -> Thread.sleep -> Konflikt Java Basics - Anfänger-Themen 7
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben