Moin
Ich habe folgendes Beispiel verwendet:
http://java.sun.com/j2se/1.4/docs/guide/misc/threadP…
Da stellt sich die Frage habe ich tatsaechlich 2 Threads?
wait und notify resp. stop und resume brauchen immer 2 oder mehr Threads.
Im Beispiel (habs nur kurz drübergelesen, muss nicht alles stimmen) gibts die 2 Threads Blinker und AWT.event. Der AWT.event-Thread läuft immer wenn eine GUI im Spiel ist. Er führt die Methoden paint(), Actionperforment(), Keypressed(),… usw. aus. Er wird automatisch gestartet sobald irgendwas von wegen GUI angezeigt wird. Wenn der Thread steht (in einem wait hängt) reagiert die GUI nicht mehr.
Der 2. Thread „Blinker“ soll in gewissen Abständen etwas blinken lassen. Dafür wartet er eine gewisse Zeit mit sleep(). Er soll ein und aus-schaltbar sein. Deshalb soll er vom AWT.event-Thread gestoppt und wieder gestartet werden können.
Das Beispiel ist nicht besonder glücklich da es den 2. Thread „unterschlägt“. Ausserdem setzt es eine GUI vorraus.
public synchronized void einschlafen (){
public synchronized void aufwecken (){
An welcher Stelle sollen die Funktionen aufgerufen werden?
In dem Beispiel müsste man ein bisschen umbauen:
der AWT.event-Theard müsste eine Bool-Variable „anhalten“ setzten (true wenn blinker aufhören soll) dann müsste Blinker.run() etwa so aussehen:
public void run(){
while (true){
while (!anhalten){
try {
sleep(Zeit)
}catch (Exception E){
}
//Blinker umschalten und repaint aufrufen.
}
schlafStelle.einschlafen ()
}
}
Der Blinker blinkt also solange fröhlich vor sich hin wie anhalten = false ist. setzt irgendwas anhalten = true so wartet der Blinker-Thread in einschlafen() bis ihn jemand weckt (in dem Fall der AWT.Event-Thread)
der AWT.event-Thread müsste dann beim wiedereinschalten des Blinkers neben dem umsetzen von anhalten= false auch noch das aufwecken übernehmen:
anhalten = false;
BlinkerInstanz.schlafStelle.aufwachen();
(das schlafenschicken geht mit anhalten = true, ausgeführt vom AWT.Event-Thread. Setzt in jeder Methode von der du nicht weist welcher Thread sie ausführt ein System.out.println (Thread.currentThread().toString()) rein. Die Strings sind zwar unleserlich, aber sie verändern sich nicht während der Ausführung, man kann die Threads also unterscheiden)
Ist jetzt alles definitiv unklar ?
cu