Java实现生产者与消费者(三)(多生产者多消费者)

来源:互联网 发布:王心凌怎么消失了知乎 编辑:程序博客网 时间:2024/06/15 01:38
        本文实现的是多生产者与多消费者的问题。如果直接在上篇文章中多加入一个生产者线程和一个消费者线程,则会产生一个生产者生产多个或者一个消费者消费多个的情况,解决办法是将consume和produce函数的最前面的一句if改为while,但是仅仅是这样的话又会产生死锁现象,最终将notify()函数改为notifyall()函数,即每生产或者消费一个后都要将对方线程池的所有线程都唤醒。于是就可以实现多生产者和多消费者同时操作一资源。代码如下:
package threadCommunication;//生产者和消费者共享的资源class Resource{String name;String sex;boolean flag=false;//将生产的环节封装成resource里面,并且封装成同步函数public synchronized void produce(String name,String sex){//if(flag){while(flag){//将if改为whiletry {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//注意:被唤醒后从此执行this.name=name;this.sex=sex;System.out.println("输入:"+name+"性别:"+sex);this.flag=true;this.notifyAll();}//同理将消费者封装到resource里面,封装成同步函数public synchronized void consume(){//if(!flag){while(!flag){//将if改为whiletry {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//注意:被唤醒后从此执行System.out.println("输出:"+this.name+"性别:"+this.sex);this.flag=false;this.notifyAll();}}//输入,代表的是生产者class Input implements Runnable{Resource r;Input(Resource r){this.r=r;}public static int x=1;public void run() {while(true){r.produce("小光"+x, "男");x++;if(x>10)x=1;}}}//输出,代表的是消费者 class Output implements Runnable{Resource r;String name;Output(Resource r){this.r=r;}public void run() {while(true){r.consume();}}}public class InputOutput3 {/** * @param args *  */public static void main(String[] args) {Resource r=new Resource();Input in1=new Input(r);Output out1=new Output(r);Input in2=new Input(r);Output out2=new Output(r);new Thread(in1).start();new Thread(out1).start();new Thread(in2).start();new Thread(out2).start();}}

运行结果如下:


注:同步里面活着的县城不知一个,但执行的只有一个,即谁拥有锁谁执行。

wait()释放了锁,其他线程获得了执行的机会,而sleep()不释放锁。


注:while判断标记解决了线程获取执行权后是否要运行的问题。

       notify()只唤醒一个线程,如果唤醒了本方,则没有意义,而while+notify()又会导致死锁。

       notifyall()解决了本方线程一定会唤醒对方线程的问题。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 居住证过期2年怎么办 被房东坑了怎么办 房东违反了合同怎么办 上海居住证过期了怎么办 地铁卡消磁了怎么办 学生卡消磁了怎么办 家属院没房产证怎么办 邮箱收不到邮件怎么办 大学宿舍八人间怎么办 高中档案袋拆了怎么办 公派教师回国后怎么办? 事业单位辞职后档案怎么办 学信支付不了怎么办 校外怎么办北邮校园卡 报考身份证丢了怎么办 买房怎么办不取消低保 自考找不到真题怎么办 自考生考研没有档案怎么办 自考本科无学位怎么办 自考学位证书没拿到怎么办 自考毕业证出生日期错误怎么办 成考没有学位证怎么办 评职称学历认证怎么办 国家不承认学历怎么办 高考分数错了怎么办 签合同了不想干怎么办 贵港教育小学插班生怎么办 学校宿舍限瓦怎么办 苹果锁屏后wifi断开怎么办 兼职一天不给钱怎么办 五月孩子掉床怎么办 孩子五月份掉床怎么办 郑州怎么办暂住证凭条 郑州居住证凭条怎么办 宿舍虫子咬人怎么办 is语音注册频繁怎么办 苹果id注销了怎么办 网站突然打不开了怎么办 谷歌邮箱打不开怎么办 360借款无力承担怎么办 公司被收购期权怎么办