A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

jdk1.5同步锁模拟经典同步问题之生产者消费者. 代码如下
  1. import java.util.ArrayList;
  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;

  5. /**
  6. * 使用JDK1.5线程同步锁新特性实现生产者和消费者的例子
  7. *
  8. */
  9. class Main {
  10.         public static void main(String[] args) {
  11.                 Buffer buffer = new Buffer();
  12.                 Producer producer  = new Producer(buffer);
  13.                 Consumer consumer  = new Consumer(buffer);
  14.                
  15.                 producer.start();
  16.                 consumer.start();
  17.         }
  18. }

  19. // 商品缓冲区
  20. class Buffer {
  21.         private Lock lock;
  22.         private Condition full;
  23.         private Condition empty;

  24.         //商品缓冲区最大容量4
  25.         private static int MAX_CAPACITY = 4;
  26.         private ArrayList<Commodity> buffer = new ArrayList<Commodity>(MAX_CAPACITY);

  27.         Buffer() {
  28.                 lock = new ReentrantLock();
  29.                 full = lock.newCondition();
  30.                 empty = lock.newCondition();
  31.         }

  32.         public void add(String local, float weight) {
  33.                 lock.lock();

  34.                 try {
  35.                         if (buffer.size() >= MAX_CAPACITY) {
  36.                                 System.out.println("buffer满了, 阻塞生产线程");
  37.                                 full.await();
  38.                         }
  39.                        
  40.                         Commodity commodity = new Commodity(local, weight);
  41.                         buffer.add(commodity);
  42.                         System.out.println("生产: " + commodity.toString() + "  " + "还剩下商品   " + buffer.size());
  43.                         empty.signal();
  44.                 } catch (InterruptedException e) {
  45.                         e.printStackTrace();
  46.                 } finally {
  47.                         lock.unlock();
  48.                 }
  49.         }

  50.         public void remove() {
  51.                 lock.lock();

  52.                 try {
  53.                         if (buffer.size() <= 0) {
  54.                                 System.out.println("buffer空了, 阻塞消费者线程       " + buffer.size());
  55.                                 empty.await();
  56.                         }

  57.                         Commodity commodity = buffer.remove(buffer.size() - 1);
  58.                         System.out.println("消费: " + commodity.toString() + "  " + "还剩下商品   " + buffer.size());

  59.                         full.signal();
  60.                 } catch (InterruptedException e) {
  61.                         e.printStackTrace();
  62.                 } finally {
  63.                         lock.unlock();
  64.                 }
  65.         }
  66. }

  67. /**
  68. *
  69. * 生产的商品实体
  70. */
  71. class Commodity {
  72.         private String local;
  73.         private float weight;

  74.         public Commodity(String local, float weight) {
  75.                 this.local = local;
  76.                 this.weight = weight;
  77.         }

  78.         @Override
  79.         public String toString() {
  80.                 return "Commodity [local=" + local + ", weight=" + weight + "]";
  81.         }

  82. }

  83. // 生产者线程
  84. class Producer extends Thread {
  85.         private Buffer buffer;

  86.         Producer(Buffer buffer) {
  87.                 this.buffer = buffer;
  88.         }

  89.         @Override
  90.         public void run() {
  91.                 for (int i = 0;; i++) {
  92.                         try {
  93.                                 Thread.sleep(500);
  94.                         } catch (InterruptedException e) {
  95.                                 e.printStackTrace();
  96.                         }
  97.                        
  98.                        
  99.                         buffer.add("BJ", i);
  100.                 }
  101.         }
  102. }

  103. // 消费者线程
  104. class Consumer extends Thread {

  105.         private Buffer buffer;

  106.         Consumer(Buffer buffer) {
  107.                 this.buffer = buffer;
  108.         }

  109.         @Override
  110.         public void run() {
  111.                 while(true){
  112.                         try {
  113.                                 Thread.sleep(500);
  114.                         } catch (InterruptedException e) {
  115.                                 e.printStackTrace();
  116.                         }
  117.                        
  118.                         buffer.remove();
  119.                 }
  120.         }
  121. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马