本帖最后由 周兴中 于 2012-6-25 00:28 编辑  
 
public synchronized void Set(String name, String sex) { 
                if (flag) //用if来判断有个缺点,当之前等待的线程被再次唤醒时,不再判断标记,而继续往下执行,会造成多输入一次数据. 
                { 
                        try { 
                                this.wait(); 
                        } catch (Exception e) { 
                        } 
                 } 
                  this.name = name; 
                  this.sex = sex; 
                  flag = true; 
                  this.notify();  //notify()是按先进先出的原则唤醒线程池中等待的线程,如果判断标记处用while语句,将有可能出现所有线程都处于等待状态,导致程序出现类似冻结的状态.所以 
                                        当判断标记用while时,此处用notifyALL(). 
        } 
        public synchronized void Out() { 
                if (flag) // 此处标记应该是判断false 既if(!flag) 
                        try { 
                                this.wait(); 
                        } catch (Exception e) { 
                        } 
                System.out.println(name + "......." + sex); 
                flag = false; 
                this.notify(); 
        } 
 
你这个程序当只有一个输入线程和一个输出线程时可以正常运行,但是当出现多个输入线程和输出线程时,会出现输入多次,却只输出一次;或输入一次,却输出多次的情况. 
 
建议使用 while()判断标记,notifyAll()唤醒所有等待线程的方式. 
例: 
while(flag) 
                        try { 
                                this.wait(); 
                        } catch (Exception e) { 
                        } 
                System.out.println(name + "......." + sex); 
                flag = false; 
                this.notifyAll(); 
 
 |