黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: 李健_8    时间: 2012-11-22 16:16
标题: 多线程问题
本帖最后由 李健_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-22 20:17
this.name=name+"---"+aa++;
                n();
System.out.println(aa++); //并不是从0开始记值得
因为你的第一行代码已经++了一次,所以值就为1了,当你再次输出时候就成1开始了。
作者: 李健_8    时间: 2012-11-23 02:44
王阳 发表于 2012-11-22 20:17
this.name=name+"---"+aa++;
                n();
System.out.println(aa++); //并不是从0开始记值得

不是啦  他是从好几千开始记数的  
作者: 王阳    时间: 2012-11-23 20:02
李健_8 发表于 2012-11-23 02:44
不是啦  他是从好几千开始记数的

不晓得了,会不会输出太多,所以没看到的原因
作者: 郑世光    时间: 2012-11-23 20:23
本帖最后由 郑世光 于 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();
        }

作者: filter    时间: 2012-11-23 21:08
我修改的部分代码
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();
        }





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2