欢迎来到天天文库
浏览记录
ID:55752850
大小:43.00 KB
页数:4页
时间:2020-06-05
《讲稿JAVA中用户级线程示例.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1.加入同步机制的生产者与消费者问题//生产者类classProducerextendsThread{privateShareshare;privateintnumber;publicProducer(Shares,intnumber){share=s;this.number=number;}publicvoidrun(){for(inti=0;i<10;i++){share.put(i);System.out.println("生产者"+this.number+"输出的数据为:"+i);try{slee
2、p((int)(Math.random()*100));}catch(InterruptedExceptione){}}}}//消费者类classConsumerextendsThread{privateShareshare;privateintnumber;publicConsumer(Shares,intnumber){share=s;this.number=number;}publicvoidrun(){intvalue=0;for(inti=0;i<10;i++){value=share.get(
3、);System.out.println("消费者"+this.number+"得到的数据为:"+value);}}}//加入同步机制的共享资源类classShare{privateintcontents;privatebooleanavailable=false;publicsynchronizedintget(){while(available==false){try{wait();}catch(InterruptedExceptione){}}available=false;notifyAll();
4、returncontents;}publicsynchronizedvoidput(intvalue){while(available==true){try{wait();}catch(InterruptedExceptione){}}contents=value;available=true;notifyAll();}}//主类classH1{publicstaticvoidmain(String[]args){Shares=newShare();Producerp=newProducer(s,1);C
5、onsumerc=newConsumer(s,1);p.start();c.start();}}输出:生产者1输出的数据为:0消费者1得到的数据为:0生产者1输出的数据为:1消费者1得到的数据为:1消费者1得到的数据为:2生产者1输出的数据为:2消费者1得到的数据为:3生产者1输出的数据为:3生产者1输出的数据为:4消费者1得到的数据为:4消费者1得到的数据为:5生产者1输出的数据为:5消费者1得到的数据为:6生产者1输出的数据为:6消费者1得到的数据为:7生产者1输出的数据为:7消费者1得到的数据为:8
6、生产者1输出的数据为:8消费者1得到的数据为:9生产者1输出的数据为:9·分析:1)未加入同步机制时Producer与Consumer的运行速度不同,不能保证Producer放一个数Consumer取一个数。可能有两种情况:(本例中生产者休眠若干秒,故生产者慢)①Producer比Consumer快,Producer放入的数据Consumer来不及取,可能丢失数据。②Consumer比Producer快,Consumer可能取出相同数据。本例中Consumer取出的全为0,既是这种情况。2)加入同步机制后
7、,保证了Producer放一个数Consumer取一个数。可能发生的情况有:①Producer先运行(即先调用put()),Producer与Consumer速度一致,保证了Producer放一个数Consumer取一个数。因为available初值为false,Producer调用put()时,越过while循环,把数据value放入contents中,然后置available=true。Consumer调用get()时,也越过while循环,取出数据,同时执行available=false。二者交替执
8、行,保证了Producer放一个数Consumer取一个数。②Producer比Consumer快当Producer执行put()把available置成true,而Consumer还没来得及执行available=false时,Producer再一次执行put(),进入while循环,在wait()处进入等待状态。当Consumer执行到notifyAll()时,Producer被唤醒。③Consumer比Producer快
此文档下载收益归作者所有