Verwenden Sie "notify ()" und "wait ()" anstelle von "suspend ()" und "resume ()", um einen Thread zu steuern
Ich versuche zu lernen, wie man einen Thread in Java anhält und wieder aufnimmt. Ich benutze eineApplet
Dasimplements Runnable
hat 2 Tasten "Start" und "Stop".
public void init(){
th = new Thread(this);
th.start();
btn_increment = new Button("Start");
btn_increment.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev){
th.notify();
}
});
add(btn_increment);
btn_decrement = new Button("Stop");
btn_decrement.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev){
try{
th.wait();
} catch(InterruptedException e) {
e.printStackTrace();
}
}
});
add(btn_decrement);
}
Die Ausführungsmethode des Threads:
public void run(){
while(true){
repaint();
try{
Thread.sleep(20);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
Wenn ich jetzt versuche, den Thread anzuhalten oder fortzusetzen, wird eine Ausnahme ausgelöst:
Exception in thread "AWT-EventQueue-1" java.lang.IllegalMonitorStateException
Anmerkungen:
Der vorherige Code läuft einwandfrei, wenn ich die veralteten Methoden verwendesuspend()
undresume()
, aber die Dokumentation weist auf die Verwendungnotify()
undwait()
stattdessen mit Synchronisation. Ich habe versucht, das Wort hinzuzufügensynchronized
zumactionPerformed
Methode, aber es löst immer noch die Ausnahme.
Kann mir bitte jemand erklärenWARUM Das funktioniert nicht und wie kann man das Synchronisationsproblem lösen? Wenige Erklärungspunkte wären wirklich hilfreich;)