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

    测试结果如下

    
    
  • 相关阅读:
    Django学习2
    Django学习1
    python 基于tcp协议的文件传输3_解决粘包问题
    python socketserver
    python hashlib
    python struct模块
    python json 模块
    python socket模块
    13暑假集训#10 总结
    hdu 4493 卡输入输出
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/9729556.html
Copyright © 2011-2022 走看看