为了账号安全,请及时绑定邮箱和手机立即绑定

Java wait() notify()循环打印A和B

Java wait() notify()循环打印A和B

SMILET 2019-03-28 19:15:42
public class Test {        public static Object object = new Object();    public static boolean printA = true;        public static void main(String[] args) {        ThreadA threadA = new ThreadA();        threadA.start();                ThreadB threadB = new ThreadB();        threadB.start();    }} class ThreadA extends Thread {        @Override    public void run() {        for(int i = 0; i < 10; i++) {            synchronized (Test.object) {                if(!Test.printA) {                    try {                        Test.object.wait();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                } else {                    System.out.println("A");                    Test.printA = false;                    Test.object.notify();                }            }        }    }}class ThreadB extends Thread {        @Override    public void run() {        for(int i = 0; i < 10; i++) {            synchronized (Test.object) {                if(Test.printA) {                    try {                        Test.object.wait();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                } else {                    System.out.println("B");                    Test.printA = true;                    Test.object.notify();                }            }        }    }}运行以上代码,为什么会一直不结束无限wait下去?
查看完整描述

5 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

实际上线程中不应该有else,把else注释掉就正确了。 如果加上else后,该线程会在wait后不再notify,导致另一个线程无限wait。


public class Test {

    

    public static Object object = new Object();

    public static boolean printA = true;

    

    public static void main(String[] args) {

        ThreadA threadA = new ThreadA();

        threadA.start();

        

        ThreadB threadB = new ThreadB();

        threadB.start();

    }

}

 

class ThreadA extends Thread {

    

    @Override

    public void run() {

        for(int i = 0; i < 10; i++) {

            synchronized (Test.object) {

                if(!Test.printA) {

                    try {

                        Test.object.wait();

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }/* else {*/

                    System.out.println("A");

                    Test.printA = false;

                    Test.object.notify();

                /*}*/

            }

        }

    }

}


class ThreadB extends Thread {

    

    @Override

    public void run() {

        for(int i = 0; i < 10; i++) {

            synchronized (Test.object) {

                if(Test.printA) {

                    try {

                        Test.object.wait();

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }/* else { */

                    System.out.println("B");

                    Test.printA = true;

                    Test.object.notify();

                /*}*/

            }

        }

    }

}


查看完整回答
反对 回复 2019-04-16
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

这个和生产者消费者的问题很像。你题目中无限wait下去唯一的情况是:当ThreadAThreadB有一方已执行完,未执行完的线程wait之后,另一线程并不能唤醒它,因为那个线程已跑完了。


查看完整回答
反对 回复 2019-04-16
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

A线程先跑,如果B还没有wait的时候,A已经notify了,这时这个notify就没有效果,等B开始wait了,A的notify已经跑完了,根本永远得不到通知,你这么写逻辑是有问题的


查看完整回答
反对 回复 2019-04-16
?
慕村9548890

TA贡献1884条经验 获得超4个赞

很明显ThreadB先wait,但代码却ThreadA先调用.... 只要让ThreadB先执行就可以了


ThreadB threadB = new ThreadB();

threadB.start();

        

Thread.sleep(10);

        

ThreadA threadA = new ThreadA();

threadA.start();

注意:两个Thread同时执行,java并不能能保证先调用的Thread先执行。


查看完整回答
反对 回复 2019-04-16
  • 5 回答
  • 0 关注
  • 761 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信