Thread Implementierung

serior

Grünschnabel
Hallo Leute,

ich lerne gerade für eine Klausur und komme mit folgender Frage nicht klar. Könnt ihr mir vielleicht helfen?

Die Frage lautet wie folgt:
Ergänzen Sie das folgende Kode-Fragment so, dass folgendes Verhalten korrekt implementiert wird:
Die Methode run() der Klasse T führt die sleep()-Methode in einer Endlosschleife aus. Der
Aufruf t.suspendThread() soll die sofortige Suspendierung des Threads t bewirken. Der Aufruf
t.resumeThread() soll die Wiederaufnahme des Threads t bewirken. Andere Threads sollen nicht
beeinflusst werden.
Achten Sie darauf, dass Objektsperren nur dann belegt werden, wenn dies erforderlich ist!
Deprecated-Methoden sind nicht gestattet!

PS: Was heißt in diesem Fall suspendieren? Ich habe es mit wait und notify versucht, bin aber nicht weitergekommen.
Code:
public class B {
    
    public static void main(String args[]){
        T t=new T();
        t.start();
        consumeTime(); //verbrauche etwas Zeit
        t.suspendThread; // Thread t suspendieren
        consumeTime();
        t.resumeThread(); //Thread t soll weiterarbeiten
        //....
    }
    //...
}
 
class T extends Thread {
     
    public void run() {
        
        while (true) {
            Thread.sleep(10000);
        }
    }
 
    public void suspendThread(){
        
    }
    
    public void resumeThread(){
        
    }
}
 

serior

Grünschnabel
Der Tipp war echt gut, aber ich kriege es immer noch nicht hin, ich habe ins suspend folgendes geschrieben:
void suspendThread(){
pause=false;
synchronized (this){
try {
wait();
}catch(InterruptedException e){}
}
}
aber er benutzt die wait methode gar nicht.
weisst du wo mein Fehler liegt?
 

veeman

Mitglied
Naja die wait Methode wird so wie du sie verwendest nichts machen, da diese vom Hauptthread aufgerufen wird.

Die eigentliche Idee ist es den zweiten Thread laufen zulassen und mittels einer Hilfsvariable entweder in einen Pause oder in einen Arbeitszustand zu setzen. Da auf diese Hilfsvariable von mehreren Threads zugegriffen wird muss sichergestellt werden dass immer nur ein Thread gleichzeitig die Variable lesen/schreiben kann.
Dazu wird das Schlüsselwort synchronized verwendet. Entweder so wie in dem verlinktem Beispiel oder wie folgt:

Code:
public synchronized void suspendThread(){
        pause = true;
}

In der Run-Methode des Threads kannst du die Variable nun abfragen und ggf. mittels wait schlaffen legen. Genauso kann mittels notify der Thread wieder aufgeweckt werden, die Ausfürung des Threads erfolgt dabei weiter nach dem wait Befehl.

In deinem Fall dann so aussehen:
Code:
 public void run() {
        
        while (true) {
            Thread.sleep(10000);

            synchronized (this) {
               while (pause) {
                  try {
                     wait();
                  } catch (Exception e) {
                     e.printStackTrace();
                  }
               }
            }
        }
    }

Wie du die andere Methode nun schreiben musst sollte klar sein.
Zu beachten ist jedoch dass durch den Aufruf von suspendThread der Thread nicht sofort "schlafen" gelegt wird, es muss dafür zuerst der entsprechende Codeblock im Thread ausgeführt werden.

Mfg veeman
 

Neue Beiträge