问题描述
classshenimplementsRunnable{xunixu;publicshen(xunixu){this.xu=xu;}publicvoidrun(){intx=0;while(true){synchronized(xu){try{if(xu.bfull){xu.wait();}}catch(Exceptionex){}if(x==0){xu.name="lizhao";//try{Thread.sleep(1);}catch(Exceptionex){}xu.sex="man";}else{xu.name="xingyu";xu.sex="male";}xu.bfull=true;xu.notify();}x=(x+1)%2;}}}classxiaoimplementsRunnable{xunixu;publicxiao(xunixu){this.xu=xu;}publicvoidrun(){while(true){synchronized(xu){try{if(!xu.bfull){xu.wait();}}catch(Exceptionex){}System.out.print(xu.name+":");System.out.println(xu.sex);xu.bfull=false;xu.notify();}}}}classxuni{Stringname="no";Stringsex="no";booleanbfull=false;//缓冲区中不为空的标识}classzhu{publicstaticvoidmain(String[]args){xunixu2=newxuni();newThread(newshen(xu2)).start();newThread(newxiao(xu2)).start();}}以上程序的运行顺序是怎么样的?是先运行xiao类中的run方法,还是先运行shen类中的run方法.bfull=false代表缓冲区不为空.如果先运行xiao类中的run方法,就直接进入等待状态了.如果是先运行shen类中的run方法,也是进入等待状态了.我对这个迷糊的不行,谁能给我解读一下:)
解决方案
解决方案二:
楼主我教你怎么贴代码:1、将代码进行良好的格式化,以方便阅读。2、在发帖文本框的上方单击“#”按钮,选择Java3、将代码粘贴到【code=Java】和【/code】之间。发出来的帖子就会是下面的效果:publicclassHello{//程序入口publicstaticvoidmain(String[]args){System.out.println("Hello!");}}
解决方案三:
我也试试publicclassreadPro{publicstaticvoidmain(String[]args)throwsIOException{Propertiespro=newProperties();FileInputStreamfis=newFileInputStream("pro.properties");pro.load(fis);}}
解决方案四:
不是没从给你回答,只要看你的程序太累(命名有问题),自已参考这:要想调用wait()就得先获得对象锁(所以wait()只能在同步语句块里调用),如果一个线程wait()它就会在释放对象锁的同时进入等待池,除非有线程触发notify()才能把它从等待池中释放出来两种情况:运行状态--(synchronized)----->得到对象锁--------(wait())------->等待池---(外部的notify())---->synchronized外等待等待得不到就一直等待(在对象锁池)没notify()就一直在等待池里等着(除非它再次获得对象锁)运行状态--synchronized------->进入对象锁池----得到对象锁--->就绪状态
解决方案五:
classtest1implementsRunnable{intable=0;test3t3;publictest1(test3t3){this.t3=t3;}publicvoidrun(){while(true){if(able==0){t3.set("lizhao","man");able=1;}else{t3.set("xingyu","male");able=0;}}}}classtest2implementsRunnable{test3t3;publictest2(test3t3){this.t3=t3;}publicvoidrun(){while(true){t3.get();}}}classtest3{Stringname="no";Stringsex="no";booleanbfull=false;publicsynchronizedvoidset(Stringname,Stringsex){if(bfull){try{wait();}catch(Exceptionex){}}this.name=name;this.sex=sex;bfull=true;notify();}publicsynchronizedvoidget(){if(!bfull){System.out.println(!bfull);try{wait();}catch(Exceptionex){}}System.out.println(name+":"+sex);bfull=false;notify();}}classtest4{publicstaticvoidmain(String[]args){test3t3=newtest3();newThread(newtest1(t3)).start();newThread(newtest2(t3)).start();}}
我把原来的代码改动了一下,这样看起来清楚点.问题是:在test3类中的set()方法中,if(bfull)这个括号中的bfull是true还是false?如果是true,是不是一开始就进入了wait状态?bfull的初始化是false,怎么会变成true呢?
解决方案六:
你的程序看起来太累了,notify()唤醒在此对象监视器上等待的单个线程。wait()在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待。它们都是object中的方法.
解决方案七:
5楼的姐姐,你说的wait和notify的关系,我已经搞清楚了,令我糊涂的是:在xuni类中bfull的定义是false,怎么在shen类中的run()方法中的if(xu.bfull)这里,它却是true呢?
解决方案八:
/**1>如果是true,是不是一开始就进入了wait状态?是的*2>bfull的初始化是false,怎么会变成true呢?因为它被test3.set()方法给了*这道题:你只能先set(),而不能先get(),既使你先get(),它也会被wait(),只到set()完去notify它*去看看"生产着和消费着",它里面就把wait()和notify()表达的很清楚了***/