Używanie „notify ()” i „wait ()” zamiast „suspend ()” i „resume ()” do sterowania wątkiem
Próbuję dowiedzieć się, jak wstrzymać i wznowić wątek w Javie. UżywamApplet
żeimplements Runnable
ma 2 przyciski „Start” i „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);
}
Metoda uruchamiania wątku:
public void run(){
while(true){
repaint();
try{
Thread.sleep(20);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
Teraz, gdy próbuję wstrzymać lub wznowić wątek, zgłaszany jest wyjątek:
Exception in thread "AWT-EventQueue-1" java.lang.IllegalMonitorStateException
Uwagi:
Poprzedni kod działa doskonale, jeśli używam przestarzałych metodsuspend()
iresume()
, ale dokumentacja wskazuje na użycienotify()
iwait()
zamiast synchronizacji. Próbowałem dodać słowosynchronized
doactionPerformed
metoda, ale nadal rzuca wyjątek.
Czy ktoś może wyjaśnićCZEMU to nie działa i jak rozwiązać problem synchronizacji? Niewiele punktów wyjaśniania byłoby naprawdę bardzo pomocne;)