• 生产者消费者模型


    import java.util.*;
    import java.util.concurrent.*;
    import java.util.concurrent.locks.*;
    
    public class ConsumerProducer {
        private static Buffer buffer = new Buffer();
    
        public static void main(String[] args) {
            ExecutorService executor = Executors.newFixedThreadPool(2);
            executor.execute(new ProducerTask());
            executor.execute(new ConsumerTask());
            executor.shutdown();
        }
    
        private static class ProducerTask implements Runnable {
            @Override
            public void run() {
                try {
                    int i = 1;
                    while (true) {
                        System.out.println("Producer writes 	" + i);
                        buffer.write(i ++);
                        Thread.sleep((int)(Math.random() * 10000));
                    }
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        }
    
        private static class ConsumerTask implements Runnable {
            public void run() {
                try {
                    while (true) {
                        System.out.println("								Consumer reads:	" + buffer.read());
                        Thread.sleep((int)(Math.random() * 10000));
                    }
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        }
    
        private static class Buffer {
            private static final int CAPACITY = 1;
            private LinkedList<Integer> queue = new LinkedList<>();
    
            private Lock lock = new ReentrantLock();
            private Condition notEmpty = lock.newCondition();
            private Condition notFull = lock.newCondition();
    
            public void write(int value) {
                lock.lock();
                try {
                    while (queue.size() == CAPACITY) {
                        System.out.println("Wait for notFull conditino");
                        notFull.await();
                    }
                    queue.offer(value);
                    notEmpty.signal();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
    
            public int read() {
                int value = 0;
                lock.lock();
                try {
                    while (queue.isEmpty()) {
                        System.out.println("								Wait for notEmpty condition");
                        notEmpty.await();
                    }
                    value = queue.poll();
                    notFull.signal();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                } finally {
                    lock.unlock();
                    return value;
                }
            }
        }
    }
    
    
  • 相关阅读:
    day02_1spring3
    day01_2spring3
    动态代理的介绍
    day04_1hibernate
    day03_2hibernate
    Oracle11gR2安装完成后不手动配置监听的使用方法
    css的样式和选择符的优先权
    调用css时,link和@import url的区别
    jquery 获取和修改img标签的src属性
    正则表达式实现6-10位密码由数字和字母混合组成
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744371.html
Copyright © 2020-2023  润新知