[英]How do I pause Threads properly with wait() and notify()
我想有一個啟動Thread的類,並提供暫停和繼續此Thread的方法。 我的第一種方法是使用flag,只要值為true,就會循環一個sleep方法。 就像是 :
public class Bot {
private Thread t ;
private boolean isPaused;
public Bot(){
t = new Thread(new Runnable(){
@Override
public void run() {
while (true) {
System.out.println("Hi");
while(isPaused){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
t.start();
}
public void pauseBot(){
isPaused = true;
}
public void continueBot(){
isPaused = false;
}
}
但由於線程仍在運行並浪費CPU,我不認為這是一個很好的解決方案。 這看起來如何使用wait()和notify()。 我看了一下有關該主題的各種教程,但不知怎的,我無法將它們應用到我的問題中。
每次我嘗試它時,我或者得到了IllegalMonitorStateException,或者代碼停止了我的整個應用程序,而不僅僅是我想要停止的線程。
我的另一個問題是:如何防止線程在關鍵時刻暫停,例如
Runnable r = new Runnable(){
@Override
public void run() {
while(true){
task1();
task2();
//Thread mustn't be stopped from here....
task3();
task4();
task5();
task6();
task7();
//... to here
task8();
task9();
task10();
}
}
};
因為當task3().... task7()處理在Thread暫停時會過期的東西時,必須有一種方法讓Thread完成task7()直到它暫停。
我希望你能幫我解決我的問題。 提前謝謝,弗洛
所以這是你的Thread類:
public class MyThread extends Thread
{
首先,您需要一個鎖定對象。 此對象可以是所有內容,如果使用現有對象,則占用的內存較少。 如果機器人應該暫停,也要定義一個標志。
public Object lock = this;
public boolean pause = false;
現在,為線程定義pause()
和continue()
方法。 這設置了pause
標志。
public void pause ()
{
pause = true;
}
public void continue ()
{
pause = false;
在這里你需要喚醒線程。 請注意鎖定對象上的synchronized,以便您不會收到IllegalMonitorStateException
。
synchronized (lock)
{
lock.notifyAll();
}
}
不,定義一個在應該暫停時自動暫停線程的方法。 您可以在線程暫停時隨時調用此方法。
private void pauseThread ()
{
synchronized (lock)
{
if (pause)
lock.wait(); // Note that this can cause an InterruptedException
}
}
現在,您可以在run()
方法中定義您的線程:
public void run ()
{
task1();
task2();
pauseThread();
task3();
task4();
task5();
task6();
task7();
pauseThread();
task8();
task9();
task10();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.