zoukankan      html  css  js  c++  java
  • 利用J.U.C中的lock和condition实现生产者消费者模式

      1 package lockTest;
      2 
      3 import java.util.LinkedHashMap;
      4 import java.util.LinkedList;
      5 import java.util.concurrent.locks.Condition;
      6 import java.util.concurrent.locks.Lock;
      7 import java.util.concurrent.locks.ReentrantLock;
      8 
      9 public class ConditionTest {
     10 
     11     private Lock lock;
     12 
     13     private LinkedList<String> buffer;
     14 
     15     private int maxSize;
     16 
     17     private Condition notfullCondition;
     18 
     19     private Condition fullCondition;
     20 
     21     public ConditionTest(int maxSize) {
     22         this.maxSize = maxSize;
     23         lock = new ReentrantLock();
     24         buffer = new LinkedList<>();
     25         this.maxSize = maxSize;
     26         notfullCondition = lock.newCondition();
     27         fullCondition = lock.newCondition();
     28     }
     29 
     30     public void produce(String goods) throws InterruptedException {
     31 
     32         lock.lock();
     33 
     34         try {
     35 
     36             while (maxSize == buffer.size()) {
     37                 notfullCondition.await();
     38                 System.out.println("工厂产能达到极限,不能继续进行生产了,停工一段时间");
     39             }
     40 
     41             //队列没有满,可以生产
     42             buffer.add(goods);
     43 
     44             System.out.println("哈哈,我生产了" + goods + ",通知消费者进行消费...");
     45             //通知消费者线程进行消费
     46             fullCondition.signalAll();
     47 
     48         } finally {
     49             lock.unlock();
     50         }
     51     }
     52 
     53     public String consume() throws InterruptedException {
     54 
     55         String goods = null;
     56         lock.lock();
     57 
     58         try {
     59 
     60             while (buffer.size() == 0) {
     61                 System.out.println("工厂的产品已经消费完了,暂时不能剁手了");
     62                 fullCondition.await();
     63             }
     64 
     65             //开始消费
     66             goods = buffer.poll();
     67             System.out.println("哈哈,我消费" + goods + ",通知工厂进行生产...");
     68             //通知生成者
     69             notfullCondition.signalAll();
     70 
     71         } finally {
     72             lock.unlock();
     73         }
     74 
     75         return goods;
     76     }
     77 
     78 
     79     public static void main(String[] args) {
     80 
     81         ConditionTest conditionTest = new ConditionTest(100);
     82 
     83         new Thread(() -> {
     84 
     85             for (int i = 0; i < 1000000; i++) {
     86                 try {
     87                     conditionTest.produce("笔记本电脑" + i);
     88                 } catch (InterruptedException e) {
     89                     e.printStackTrace();
     90                 }
     91             }
     92 
     93         }, "produce").start();
     94 
     95 
     96         new Thread(() -> {
     97 
     98             while (true) {
     99                 try {
    100                     conditionTest.consume();
    101                 } catch (InterruptedException e) {
    102                     e.printStackTrace();
    103                 }
    104             }
    105 
    106         }, "consume").start();
    107 
    108     }
    109 
    110 }
  • 相关阅读:
    JavaScript的数据类型和运算符总结
    html&css精华总结
    lambda表达式&map&filter&yield
    tp5.1 order函数排序无效和orderRaw自定义处理排序
    tp5.1 多对多关联,添加中间表自动时间戳
    mysql索引类型和索引方法
    a标签跨域下载文件,解决download失效问题
    js读取input[type=file]图片,并实时预览
    如何禁止浏览器自动填充
    php 一维数组的合并和去重
  • 原文地址:https://www.cnblogs.com/java-le/p/11365216.html
Copyright © 2011-2022 走看看