zoukankan      html  css  js  c++  java
  • 多线程模拟生产者消费者示例之Lock

    
    
    public class Test {
        public static void main(String[] args) {
            List<String> list = new ArrayList<>(1);
            LockEntity lockEntity = new LockEntity();
            new Thread(new PThread(list, lockEntity)).start();
            new Thread(new CThread(list, lockEntity)).start();
        }
    }
    
    /**
     * 生产者
     */
    class PThread implements Runnable {
        private List<String> list;
        private LockEntity lockEntity;
        private AtomicInteger integer = new AtomicInteger();
    
        public PThread(List<String> list, LockEntity lockEntity) {
            this.list = list;
            this.lockEntity = lockEntity;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                    //上锁
                    lockEntity.lock.lock();
                    if (lockEntity.flag) {
                        String data = integer.getAndIncrement() + "";
                        list.add(data);
                        System.out.println("生产者线程,生产一个数据:" + data);
                        lockEntity.flag = false;
                        lockEntity.condition.signal();  //唤醒
                    } else {
                        lockEntity.condition.await(); //等待
                    }
    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lockEntity.lock.unlock();
                }
            }
        }
    }
    
    
    class CThread implements Runnable {
        private List<String> list;
        private LockEntity lockEntity;
    
        public CThread(List<String> list, LockEntity lockEntity) {
            this.list = list;
            this.lockEntity = lockEntity;
    
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    lockEntity.lock.lock();
                    if (!lockEntity.flag) {
                        String data = list.remove(0);
                        System.out.println("消费者线程,消费了一个数据:" + data);
                        lockEntity.flag = true;
                        lockEntity.condition.signal();
                    } else {
                        lockEntity.condition.await();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lockEntity.lock.unlock();
                }
            }
        }
    }
    
    /**
     * 封装锁等信息
     */
    class LockEntity {
        public boolean flag = true;
        public Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
    }
    
    

    测试结果如下

    
    
  • 相关阅读:
    PHP操作Memcache基本函数
    sublime text 设置
    获取客户端IP地址经纬度所在城市
    php 中文转拼音首字母问题
    php分类
    php +mysql 添加 删除 修改 insert into delete update
    php+mysql 内联接 和 子查询
    mysql count max min 语句用法
    mysql 查询语句
    非常不错的MySQL优化的8条经验
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/9729556.html
Copyright © 2011-2022 走看看