簡體   English   中英

如何使用wait()和notify()正確暫停線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM