hc学习平台

 找回密码
 立即注册
搜索
热搜: 活动 交友 javakc
 › zhangjiafu › 日志

使用多线程模拟生产者和消费者   

2021-01-06 20:31:21 查看(309) 回复(0)

生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。 要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。通常采用进程间通信的方法解决该问题,常用的方法有信号灯法[1]等。如果解决方法不够完善,则容易出现死锁的情况。出现死锁时,两个线程都会陷入休眠,等待对方唤醒自己。该问题也能被推广到多个生产者和消费者的情形。

package CH11.d3;


import java.util.ArrayList;

import java.util.List;


public class XiaoFei {

   static List<Integer> a=new ArrayList<>();

   public final static Integer max=10;

   static Object b=new Object();

   static Object c=new Object();


   public static void main(String[] args) {

       shengchanzhe o=new shengchanzhe();

       xiaofeizhe p=new xiaofeizhe();

       o.setName("生产者:");

       p.setName("消费者:");

       o.start();

       p.start();

   }

}

class shengchanzhe extends Thread{

   @Override

   public void run() {

       while (true){

           synchronized (XiaoFei.b) {

               if (XiaoFei.a.size() >= XiaoFei.max) {

                   try {

                       XiaoFei.b.wait();

                   } catch (InterruptedException e) {

                       e.printStackTrace();

                   }

               }

           }

           synchronized (XiaoFei.c){

               if (XiaoFei.a.size()>=5){

                   XiaoFei.c.notifyAll();

               }

           }

           int r=(int)(Math.random()*5);

           try {

               Thread.sleep(r*1000);

           } catch (InterruptedException e) {

               e.printStackTrace();

           }

           XiaoFei.a.add(r);

           System.out.println("生产者:"+XiaoFei.a);

       }

   }

}

class xiaofeizhe extends Thread{

   @Override

   public void run() {

       while (true){


           synchronized (XiaoFei.c) {

               if (XiaoFei.a.isEmpty()) {

                   try {

                       XiaoFei.c.wait();

                   } catch (InterruptedException e) {

                       e.printStackTrace();

                   }

               }

           }

           int r=(int)(Math.random()*7);

           XiaoFei.a.remove(0);

           try {

               Thread.sleep(r*1000);

           } catch (InterruptedException e) {

               e.printStackTrace();

           }

           System.out.println("消费者:"+XiaoFei.a.remove(0));

           synchronized (XiaoFei.b){

               if (XiaoFei.a.size()<=5){

                   XiaoFei.b.notifyAll();

               }

           }

       }

   }

}


评论 (0 个评论)

facelist

全部作者的其他最新日志



站点统计|举报|Archiver|手机版|小黑屋|Comsenz Inc.

GMT+8, , Processed in 0.195171 second(s), 9 queries .

Powered by javakc! X1.0

© 2004-2014 javakc

f1208.com 备案号:京ICP备14030918号-1

返回顶部