亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于Java多線程遇到的問題.

關于Java多線程遇到的問題.

元芳怎么了 2019-03-20 17:19:20
1.最近在學習Java多線程,看到視頻中要實現一個類似鬧鐘和小明的情景, 要求鬧鐘響,小明關鬧鐘, 三秒后鬧鐘再響,小明再關, 重復10次程序結束. 不知道為什么我的程序小明只能輸出一次.public class Test {    public static void main(String[] args) {        Clock ck = new Clock();        new XiaoMing(ck);    }}public class Clock implements Runnable{    public Boolean isAlarm;    public Boolean shutdown;    public Clock() {        isAlarm = false;        shutdown = false;        new Thread(this).start();    }    @Override    public void run() {        for (int i = 0; i < 10; i++) {            isAlarm = true;            System.out.println("Get up * 3 !");            synchronized (this) {                notifyAll();                try {                    wait(3000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }        shutdown = true;    }}public class XiaoMing implements Runnable{    private Clock clk;    public XiaoMing(Clock clk) {        this.clk = clk;        new Thread(this).start();    }    @Override    public void run() {        while(true) {            if (clk.isAlarm) {                System.out.println("Woshixiaoming!");                clk.isAlarm = false;                synchronized (this) {                    try {                        wait();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }            else{                if(clk.shutdown)    break;            }        }    }}輸出結果如下Get up * 3 !Woshixiaoming!Get up * 3 !Get up * 3 !...(10 次 Getup, 之后程序停在那里)
查看完整描述

1 回答

?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

這是因為你沒有理解到wait(),notify(),notifyAll()這三個方法的真正作用,它們不是控制的所有線程,而是所對象的線程。
也就是說,XiaoMing 的同步鎖里調用的 wait() 方法阻塞的是 XiaoMing 這個線程;Clock 的同步鎖喚醒的是 Clock 類的對象的線程,所以 XiaoMing 的對象的線程就一直阻塞下去了
可以修改 XiaoMing 類run()方法的同步鎖

@Override

    public void run() {

        while(true) {

            if (clk.isAlarm) {

                System.out.println("Woshixiaoming!");

                clk.isAlarm = false;

                synchronized (this.clk) {

                    try {

                        this.clk.wait();

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

            }

            else{

                if(clk.shutdown)    break;

            }

        }

    }

這樣 XiaoMing 的線程會因為clk域被阻塞,直到Clock的線程調用notifyAll()

查看完整回答
反對 回復 2019-04-17
  • 1 回答
  • 0 關注
  • 590 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號