黑马程序员技术交流社区

标题: 多线程 模拟生产者和消费者功能 [打印本页]

作者: fmi110    时间: 2015-10-6 17:16
标题: 多线程 模拟生产者和消费者功能
其实应该说是 模拟 多线程对一个数组同时进行读取的功能(缓冲区)
变量 count 表示缓冲区剩余数据的个数 为0时则要求读进程等待,等于数组长度时,则要求写进程等待
这样能避免对同一个数据重复取,或者覆盖写
  1. package demo;

  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;

  5. public class ProducerAndConsumerByBuffer {

  6.         /**
  7.          * 利用数组解决生产消费问题
  8.          */
  9.         public static void main(String[] args) {
  10.                 final Buff b = new Buff();
  11.                 new Thread(){
  12.                         public void run() {
  13.                                 while(true)
  14.                                         b.pro();
  15.                         };
  16.                 }.start();
  17.                 new Thread(){
  18.                         public void run() {
  19.                                 while(true)
  20.                                         b.con();
  21.                         };
  22.                 }.start();
  23.                 new Thread(){
  24.                         public void run() {
  25.                                 while(true)
  26.                                         b.pro();
  27.                         };
  28.                 }.start();
  29.         }

  30. }
  31. class Buff{
  32.         private int[] buf = new int[5];
  33.         private int proPos = 0,conPos=0;//数组指针
  34.         private int count = 0;//指示剩余数量
  35.         Lock lock = new ReentrantLock();
  36.         Condition notFull = lock.newCondition();
  37.         Condition notEmpty = lock.newCondition();
  38.         public void pro(){
  39.                 lock.lock();
  40.                 try{
  41.                         while(count==buf.length){ //缓冲区已满  待取走
  42.                                 try {
  43.                                         notEmpty.await();
  44.                                 } catch (InterruptedException e) {
  45.                                         e.printStackTrace();
  46.                                 }
  47.                         }
  48.                         try {
  49.                                 Thread.sleep(500);
  50.                         } catch (InterruptedException e) {
  51.                                 // TODO Auto-generated catch block
  52.                                 e.printStackTrace();
  53.                         }
  54.                         buf[proPos] = 1;
  55.                         System.out.println(Thread.currentThread().getName()+"...生产"+proPos);
  56.                         if((++proPos)==buf.length)
  57.                                 proPos = 0;
  58.                         count++;
  59.                         notFull.signal();
  60.                 }finally{
  61.                         lock.unlock();
  62.                 }
  63.         }
  64.         public void con(){
  65.                 lock.lock();
  66.                 try{
  67.                         while(count==0){ //缓冲区已空  待新数据
  68.                                 try {
  69.                                         notFull.await();
  70.                                 } catch (InterruptedException e) {
  71.                                         e.printStackTrace();
  72.                                 }
  73.                         }
  74.                         try {
  75.                                 Thread.sleep(500);
  76.                         } catch (InterruptedException e) {
  77.                                 // TODO Auto-generated catch block
  78.                                 e.printStackTrace();
  79.                         }
  80.                         buf[conPos] = 0;
  81.                         System.out.println(Thread.currentThread().getName()+"...消费"+conPos);
  82.                         if(++conPos == buf.length)
  83.                                 conPos = 0;
  84.                         count--;
  85.                         notEmpty.signal();
  86.                 }finally{
  87.                         lock.unlock();
  88.                 }
  89.         }
  90. }
复制代码







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