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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李健_8 中级黑马   /  2012-11-22 16:16  /  1418 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李健_8 于 2012-11-23 02:43 编辑

package thread;

public class ProduceConsumerDemo {
        public static void main(String[] args) {
      Resource r=new Resource();
      Producer pro=new Producer(r);
      Consumer con=new Consumer(r);
      Thread t1=new Thread(pro);
      Thread t2=new Thread(con);
      t1.start();
      t2.start();

        }
}
class Resource{
        private String name;
        private int aa=0;  //我在这里定义aa是0  为什么后面++打印出来的却总是不是从0开始计算值的
        void n(){
                System.out.println(aa);
        }
        private boolean flag=false;
        
        public synchronized void set(String name){
                if(flag){
                        try {
                                wait();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                this.name=name+"---"+aa++;
                n();
                System.out.println(aa++); //显示值是好几千
                System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
            flag=true;
            this.notify();
        }
        public synchronized void out(){
                if(!flag){
                        try {
                                wait();
                        } catch (Exception e) {
                                e.toString();
                        }
                }
                System.out.println(Thread.currentThread().getName()+"           ...消费者..."+this.name);
            flag=false;
            this.notify();
        }
}
class Producer implements Runnable{
    private Resource res;
    Producer(Resource res){
            this.res=res;
    }
        public void run() {
                while(true){
                        res.set("--商品--");
                }
        }
}
class Consumer implements Runnable{
        private Resource res;
        Consumer(Resource res){
            this.res=res;
    }
        public void run() {
                while(true){
                res.out();
                }
        }
}

点评

如崔政所说  发表于 2012-11-23 09:55
大致看了下,貌似是这的问题吧:this.name=name+"---"+aa++;  发表于 2012-11-22 16:18

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
this.name=name+"---"+aa++;
                n();
System.out.println(aa++); //并不是从0开始记值得
因为你的第一行代码已经++了一次,所以值就为1了,当你再次输出时候就成1开始了。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
王阳 发表于 2012-11-22 20:17
this.name=name+"---"+aa++;
                n();
System.out.println(aa++); //并不是从0开始记值得

不是啦  他是从好几千开始记数的  
回复 使用道具 举报
李健_8 发表于 2012-11-23 02:44
不是啦  他是从好几千开始记数的

不晓得了,会不会输出太多,所以没看到的原因
回复 使用道具 举报
本帖最后由 郑世光 于 2012-11-23 20:25 编辑

楼上的说法是真确的,确实是运行太快,打印的结果没有显示前面。我今天也出口了这样的问题。
验证方法:
控制程序运行的次数,例如当生产50个时就结束程序,做法是在程序中加入System.exit(0);
在生产方法中:
public synchronized void set(String name){
                if(flag){
                        try {
                                wait();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                this.name=name+"---"+aa++;
                if(aa==50) System.exit(0);   //这样就不会输出太多的结果了            
               
System.out.println(aa++); //显示值是好几千
                System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
            flag=true;
            this.notify();
        }
回复 使用道具 举报
我修改的部分代码
class Resource{
        private String name;
        private int aa=0;  //我在这里定义aa是0  为什么后面++打印出来的却总是不是从0开始计算值的
        void n(){
                System.out.println(aa++);//楼主后面a的值加了两次
        }
        private boolean flag=false;
        
        public synchronized void set(String name){
                if(flag){
                        try {
                                wait();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        n();//这里打印一次就行,没必要重新打印
                this.name=name+"---"+aa;                               
           System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
            flag=true;
            this.notify();
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马