A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大漠孤烟 中级黑马   /  2014-5-1 23:11  /  1478 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima.thread.demo;

public class ProductDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                Resource res=new Resource();
               
                Producter pd=new Producter(res);
                Consumer cos=new Consumer(res);
               
                Thread t1=new Thread(pd);
                Thread t2=new Thread(pd);
                Thread t3=new Thread(cos);
                Thread t4=new Thread(cos);
               
                t1.start();
                t2.start();
                t3.start();
                t4.start();

        }
}
class Resource{
               
                private String name;
                private int count=1;
                private static boolean flag=false;
                //生产
          public synchronized void set(String name){
                 
                   while(flag){
                           try {
                                this.wait();
                        } catch (Exception e) {
                                // TODO: handle exception
                        }
                           this.name=name+"..."+count++; //烤鸭1、烤鸭2、烤鸭3
                          
                           System.out.print(Thread.currentThread().getName()+"......生产者.."+this.name);
                          
                           flag=true;
                           notifyAll(); //唤醒所有等待的线程
                          
                   }
         
         }
         //消费
         public synchronized  void Out (){
                 if(!flag)
                           try {
                                   wait();
                                } catch (Exception e) {
                                        // TODO: handle exception
                                }
                 
                 System.out.print(Thread.currentThread().getName()+"......消费者..."+this.name);
                 flag=false;
                 notifyAll();
                 
         }
         
}

class Producter implements Runnable{
     private Resource res;
     Producter(Resource res){
             this.res=res;
     }
     
        @Override
        public void run() {
                while(true){
                           res.set("北京烤鸭");
                }
               
        }
       
}

class Consumer implements Runnable{
    private Resource res;
   
    Consumer(Resource res){
            this.res=res;
    }
   
        @Override
        public void run() {
                while(true){
                           res.Out();
                }
               
        }
       
}
各位大侠麻烦帮忙看一下,我看着视频敲的,也不知道哪里出了问题,多线程执行控制台没有反应,也不报错??谢谢!

4 个回复

倒序浏览
  1. public class ProductDemo {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 Resource res=new Resource();
  7.                
  8.                 Producter pd=new Producter(res);
  9.                 Consumer cos=new Consumer(res);
  10.                
  11.                 Thread t1=new Thread(pd);
  12.                 Thread t2=new Thread(pd);
  13.                 Thread t3=new Thread(cos);
  14.                 Thread t4=new Thread(cos);
  15.                
  16.                 t1.start();
  17.                 t2.start();
  18.                 t3.start();
  19.                 t4.start();

  20.         }
  21. }
  22. class Resource{
  23.                
  24.                 private String name;
  25.                 private int count=1;
  26.                 private static boolean flag=false;
  27.                 //生产
  28.           public synchronized void set(String name){
  29.                  
  30.                    while(flag)  //-<span style="background-color: yellow;">----------------------你把while的{}去掉就可以了    加上{}没有再次判断条件</span>
  31.                            try {
  32.                                 this.wait();
  33.                         } catch (Exception e) {
  34.                                 // TODO: handle exception
  35.                         }
  36.                            this.name=name+"..."+count++; //烤鸭1、烤鸭2、烤鸭3
  37.                            
  38.                            System.out.println(Thread.currentThread().getName()+"......生产者.."+this.name);/<span style="background-color: yellow;">/------记得换行</span>
  39.                            
  40.                            flag=true;
  41.                            notifyAll(); //唤醒所有等待的线程
  42.                            
  43.                   
  44.          
  45.          }
  46.          //消费
  47.          public synchronized  void Out (){
  48.                  if(!flag)
  49.                            try {
  50.                                    wait();
  51.                                 } catch (Exception e) {
  52.                                         // TODO: handle exception
  53.                                 }
  54.                  
  55.                  System.out.println(Thread.currentThread().getName()+"......消费者..."+this.name);
  56.                  flag=false;
  57.                  notifyAll();
  58.                  
  59.          }
  60.          
  61. }

  62. class Producter implements Runnable{
  63.      private Resource res;
  64.      Producter(Resource res){
  65.              this.res=res;
  66.      }
  67.      
  68.         @Override
  69.         public void run() {
  70.                 while(true){
  71.                            res.set("北京烤鸭");
  72.                 }
  73.                
  74.         }
  75.         
  76. }

  77. class Consumer implements Runnable{
  78.     private Resource res;
  79.    
  80.     Consumer(Resource res){
  81.             this.res=res;
  82.     }
  83.    
  84.         @Override
  85.         public void run() {
  86.                 while(true){
  87.                            res.Out();
  88.                 }
  89.                
  90.         }
  91.         
  92. }
复制代码
改正在源代码,呵呵  记得要细心啊

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
  1. 修改后的正确代码如下:

  2. public class test {

  3.     /**
  4.      * @param args
  5.      */
  6.     public static void main(String[] args) {
  7.             Resource res=new Resource();
  8.             
  9.             Producter pd=new Producter(res);
  10.             Consumer cos=new Consumer(res);
  11.             
  12.             Thread t1=new Thread(pd);
  13.             Thread t2=new Thread(pd);
  14.             Thread t3=new Thread(cos);
  15.             Thread t4=new Thread(cos);
  16.             
  17.             t1.start();
  18.             t2.start();
  19.             t3.start();
  20.             t4.start();

  21.     }
  22. }
  23. class Resource{
  24.             
  25.             private String name;
  26.             private int count=1;
  27.             private static boolean flag=false;
  28.             //生产
  29.      public synchronized void set(String name){
  30.             
  31.                while(flag){
  32.                        try {
  33.                             this.wait();
  34.                     } catch (Exception e) {
  35.                             // TODO: handle exception
  36.                     }
  37.                       }
  38.                        this.name=name+"..."+count++; //烤鸭1、烤鸭2、烤鸭3
  39.                        
  40.                        System.out.println(Thread.currentThread().getName()+"......生产者.."+this.name);
  41.                        
  42.                        flag=true;
  43.                        notifyAll(); //唤醒所有等待的线程
  44.                      
  45.                
  46.      
  47.      }
  48.      //消费
  49.     public synchronized  void Out (){
  50.              while(!flag)
  51.                        {try {
  52.                                wait();
  53.                             } catch (Exception e) {
  54.                                     // TODO: handle exception
  55.                             }
  56.                        }
  57.             
  58.              System.out.println(Thread.currentThread().getName()+"......消费者..."+this.name);
  59.              flag=false;
  60.              notifyAll();
  61.             
  62.      }
  63.      
  64. }

  65. class Producter implements Runnable{
  66. private Resource res;
  67. Producter(Resource res){
  68.          this.res=res;
  69. }

  70.     @Override
  71.     public void run() {
  72.             while(true){
  73.                        res.set("北京烤鸭");
  74.             }
  75.             
  76.     }
  77.    
  78. }

  79. class Consumer implements Runnable{
  80. private Resource res;

  81. Consumer(Resource res){
  82.         this.res=res;
  83. }

  84.     @Override
  85.     public void run() {
  86.             while(true){
  87.                        res.Out();
  88.             }
  89.             
  90.     }
  91.    
  92. }

  93. if语句都应该改成while语句来判断!!!!,另外你的while语句括号的范围错了。
复制代码

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
多谢楼主啦,:handshake原来这里的while循环不用带{ }括号,编程习惯都加了,去掉果然可以打印,不过后面的if()判断也可以打印出来,只不过数据乱的,改成while确实正常啦。。。。。
回复 使用道具 举报
修改后的正确代码如下:

public class test {

    /**
     * @param args
     */
    public static void main(String[] args) {
            Resource res=new Resource();
            
            Producter pd=new Producter(res);
            Consumer cos=new Consumer(res);
            
            Thread t1=new Thread(pd);
            Thread t2=new Thread(pd);
            Thread t3=new Thread(cos);
            Thread t4=new Thread(cos);
            
            t1.start();
            t2.start();
            t3.start();
            t4.start();

    }
}
class Resource{
            
            private String name;
            private int count=1;
            private static boolean flag=false;
            //生产
     public synchronized void set(String name){
            
               while(flag){//范围错误
                       try {
                            this.wait();
                    } catch (Exception e) {
                            // TODO: handle exception
                    }
                      }
                       this.name=name+"..."+count++; //烤鸭1、烤鸭2、烤鸭3
                       
                       System.out.println(Thread.currentThread().getName()+"......生产者.."+this.name);
                       
                       flag=true;
                       notifyAll(); //唤醒所有等待的线程
                     
               
     
     }
     //消费
    public synchronized  void Out (){
             while(!flag)
                       {try {
                               wait();
                            } catch (Exception e) {
                                    // TODO: handle exception
                            }
                       }
            
             System.out.println(Thread.currentThread().getName()+"......消费者..."+this.name);
             flag=false;
             notifyAll();
            
     }
     
}

class Producter implements Runnable{
private Resource res;
Producter(Resource res){
         this.res=res;
}

    @Override
    public void run() {
            while(true){//修改后if换成while
                       res.set("北京烤鸭");
            }
            
    }
   
}

class Consumer implements Runnable{
private Resource res;

Consumer(Resource res){
        this.res=res;
}

    @Override
    public void run() {
            while(true){
                       res.Out();
            }
            
    }
   
}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马