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

java 为什么notify和notifyAll都不起作用?

java 为什么notify和notifyAll都不起作用?

慕娘9325324 2019-03-14 14:15:26
class Example{    public static void main(String arr[]){        ThreadB th1=new ThreadB("th1");        ThreadB th2=new ThreadB("th2");        }}class ThreadB implements Runnable{    C c;    Thread thread;    ThreadB(String name){        c=new C();        thread=new Thread(this,name);        thread.start();        }    public void run(){        if(thread.getName().equals("th1")){            for(int i=0;i<3;i++)c.t1(false);            c.t1(true);            }        if(thread.getName().equals("th2")){            for(int i=0;i<3;i++)c.t2(false);            c.t2(true);            }        System.out.println("end");        }}class C{    synchronized void t1(boolean boo){            if(boo){                notify();                return;                }            System.out.println("t1");            notify();            try{                wait();                }catch(InterruptedException exc){System.out.println(exc);}        }    synchronized void t2(boolean boo){            if(boo){                System.out.println();notify();return;                }            System.out.println("t2");            notify();//notifyAll()也没效果;        }}调用了notify()无法唤醒th1线程。
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

每个线程初始化的时候都是 c=new C(),锁住的是不同的对象。


class Example{

    public static void main(String arr[]){

        C c = new C();

        ThreadB th1=new ThreadB("th1",c);

        ThreadB th2=new ThreadB("th2",c);

    }

}

class ThreadB implements Runnable{

    C c;

    Thread thread;

    ThreadB(String name,C c){

        //c=new C();

        this.c=c;

        thread=new Thread(this,name);

        thread.start();

    }

    public void run(){

        if(thread.getName().equals("th1")){

            for(int i=0;i<3;i++)c.t1(false);

            c.t1(true);

        }

        if(thread.getName().equals("th2")){

            for(int i=0;i<3;i++)c.t2(false);

            c.t2(true);

        }

        System.out.println("end");

    }

}

class C{

    synchronized void t1(boolean boo){

        if(boo){

            notify();

            return;

        }

        System.out.println("t1");

        notify();

        try{

            wait();

        }catch(InterruptedException exc){System.out.println(exc);}

    }

    synchronized void t2(boolean boo){

        if(boo){

            System.out.println();notify();return;

        }

        System.out.println("t2");

        notify();//notifyAll()也没效果;

    }

}


查看完整回答
反对 回复 2019-04-24
?
慕丝7291255

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

这两个线程wait的对象C不是同一个,是感知不到对方的锁的


查看完整回答
反对 回复 2019-04-24
  • 2 回答
  • 0 关注
  • 964 浏览

添加回答

举报

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