我想输出的效果如那个显示。可是我遇到了问题毕老师的视频是把wait()给放到if(r.flag)后的那一行,
如图我是直接把它放进来执行的可是出来的效果和放到if(r.flag)后的效果是一样的,
我就奇怪了,
我把notify();放到wait()后那么那个输出的线程不应该是还在等待的吗?
那怎么能输出一样的结果呢?
我想象中的结果应该是两线程都在wait中啊!!多线程

解决方案 »

  1.   


    class Res{
    boolean flag;
    String name;
    String sex;
    }
    class Input implements Runnable{
    private Res r;
    Input(Res r){
    this.r = r;
    }
    public void run(){
    int a = 0;
    r.flag = true;
    synchronized(r){
    while(true){
    if(r.flag){
    if(a==0){
    r.name = "taofeifei";
    r.sex = "man";
    }
    else{
    r.name = "陶允立";
    r.sex = "女";
    }
    a=(a+1)%2;
    r.flag = false;
    try{r.wait();}catch(Exception e){}
    r.notify();

    }


    }
    }
    }
    }
    class Output implements Runnable{
    private Res r;
    Output(Res r){
    this.r = r;
    }
    public void run(){
    synchronized(r){
    while(true){
    if(!r.flag){
    System.out.println(r.name+"......"+r.sex);
    r.flag=true;
    r.notify();
    try{wait();}catch(Exception e){}
    }

    }
    }
    }
    }
    public class InputOutputTest {
    public static void main(String[] args){
    Res r = new Res();
    Input i = new Input(r);
    Output o = new Output(r);
    Thread a = new Thread(i);
    Thread b = new Thread(o);
    a.start();
    b.start();

    }
    }
      

  2.   

    Output里的wait会抛错(这里你忘了写r.wait(),这样wait是wait在了o对象上了),但是你直接catch到没管,所以这个wait根本没起作用。后面你对r.notify(),这个notify()唤醒了在Input里等待的那个线程。不过即使你改成r.wait()也是一样的,因为Input执行到wait的时候block了,然后Output打印那堆东西之后将其唤醒,然后Output进入block状态。此后Input直接notify,这又会把Output唤醒,但是Output会忙等待,因为它会一直发现r.flag是true。直到Input把flag设为flase。
      

  3.   

    你这里的wait和notify基本没用上,产生预期效果是因为synchronized关键字和那个flag
      

  4.   

    太感谢您了。那就是说线程在哪里被block下次唤醒时就是从哪里开始咯!?
      

  5.   

    wait会导致线程block,被notify之后执行其后的一句