Threads

Hallo!

Ich versuche gerade folgendes:
mouseEntered -> Thread.suspend
mouseExited -> Thread.resume

Nun sind suspend und resume leider deprecated (weil
deadlock geneigt). Es gibt einen Workaround mit wait/notify,
aber das funktioniert bei mir nicht richtig.
(In der run-methode wird auf wait gesetzt und in mouseEntered
wird notify aufgerufen. Das „entern“ funktioniert auch, aber
beim Exit passiert nichts.)
Kann mir jemand erklaeren, wie man eben suspend/resume
vermeidet?

Danke und Gruss
Patrick

Wenn ich der wait Methode einen Wert mitgebe, dann
funktioniert es.

Wenn ich der wait Methode einen Wert mitgebe, dann
funktioniert es.

irgendwas machts du falsch.

Hier mal meine Lösung:

  1. Braucht man ein Object das beide Threads „kennen“ und Methoden zum schlafen und aufwecken bereit hält:

    public class Schlaf {

    public synchronized void einschlafen (){
    System.out.println (Thread.currentThread().toString + "geht schlafen in "+this.toString());
    try {
    wait();
    } catch (Exception E){
    System.out.println ("Exception : "+E.toString());
    }
    System.out.println (Thread.currentThread().toString + " wacht auf in "+this.toString());
    }

    public synchronized void aufwecken (){
    System.out.println (Thread.currentThread().toString + " weckt alle schlafenden Thread in „+this.toString()+ " auf“);
    this.notifyAll();
    System.out.println (Thread.currentThread().toString + " hat alle schlafenden Thread in „+this.toString()+ " aufgeweckt“);

    }
    }

Es ist dabei wichtig die Threads alle mit dem gleichen Object arbeiten zu lassen. Auch das synchronized muss sein.

viel Spass beim testen.

Ich habe folgendes Beispiel verwendet:
http://java.sun.com/j2se/1.4/docs/guide/misc/threadP…
Schlafen geht, aufwecken aber nicht.

irgendwas machts du falsch.

Da gebe ich dir u.U. recht (s.o.).

  1. Braucht man ein Object das beide Threads „kennen“ und
    Methoden zum schlafen und aufwecken bereit hält:

Da stellt sich die Frage habe ich tatsaechlich 2 Threads?

public synchronized void einschlafen (){
public synchronized void aufwecken (){

An welcher Stelle sollen die Funktionen aufgerufen werden?

Danke
Patrick

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

1 „Gefällt mir“

Ich weiss jetzt woran es lag. Habe tatsaechlich versucht
den falschen Thread aufzuwecken, da ich den MouseListener
direkt am Label implementiert hatte.
Wenn ich diesen nun durch meine Klasse implementieren lasse
und dann an das Label haenge funktioniert zumindest
mousePressed. Mit mouseEntered/Exited geht es noch nicht.

Danke fuer deine Muehe
Patrick