簡體   English   中英

重入鎖條件

[英]Reentrant lock condition

我想創建類 Suspender 允許隨時暫停和恢復線程,但不幸的是在調用condition.signalAll()后什么也沒發生。 誰能告訴我,這是什么原因?

public class Task extends Thread{

    private Suspender suspender;

    public boolean paused = false;

    public Task(Suspender suspender){
        this.suspender = suspender;
    }

    public void resumeThread(){
        suspender.resume(this);
    }

    public void run(){
        System.out.println("Pausing");
        paused = true;
        suspender.pause(this);
        System.out.println("Resumed");
    }
}

public class Suspender{

    private ReentrantLock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();

    public void pause(Task current) {
        try{
            lock.lock();
            while(current.paused){
                condition.await();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally{
            lock.unlock();
        }
    }

    public void resume(Task current) {
        try{
            lock.lock();
            current.paused = false;
            condition.signalAll();
        }finally{
            lock.unlock();
        }
    }

}

public class Start{

    public static void main(String args[]) throws Exception {
        Suspender suspender = new Suspender();

        Task t1 = new Task(suspender), t2 = new Task(suspender);
        t1.start();
        t2.start();

        TimeUnit.SECONDS.sleep(2);
        t1.resume();
        TimeUnit.SECONDS.sleep(2);
        t2.resumeThread();

        t2.join();
    }

}

您的主線程調用t1.resume() ,但您的Task類聲明public void resume(Task current) 這是兩種不同的方法。 如果具有不同的參數列表,Java 允許不同的方法具有相同的名稱。 當您的主線程調用t1.resume()它正在調用Thread不推薦使用的方法,這將不起作用,因為線程從未被掛起。 *


* 注意: 暫停與等待條件不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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