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();
    }
    
    

    测试结果如下

    
    
  • 相关阅读:
    利用expect实现自动化操作
    svn项目权限控制
    linux jdk环境变量
    Google Authenticator加强ssh安全
    k8s之configmap配置中心
    .NET面试题目二
    .NET面试题目一
    经典.net面试题目(3)
    经典.net面试题目(2)
    经典.net面试题目(1)
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/9729556.html
Copyright © 2011-2022 走看看