java-线程-生产者-消费者

概述

在Java中有四种方法支持同步,其中前三个是同步方法,一个是管道方法。
wait() / notify()方法
await() / signal()方法
BlockingQueue阻塞队列方法
PipedInputStream / PipedOutputStream

wait() / notify()方法

public class Storage {

    private final int MAX_SIZE = 100;
    private LinkedList<Object> list = new LinkedList<>();

    private synchronized void produce(String producer) {
        while (list.size() >= MAX_SIZE) {
            System.out.println("仓库已满,【" + producer + "】: 暂时不能执行生产任务!");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        list.add(new Object());
        this.notifyAll();
    }

    private synchronized void consume(String consumer) {
        while (list.size() == 0) {
            System.out.println("仓库已空,【" + consumer + "】: 暂时不能执行消费任务!");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        list.remove();
        this.notifyAll();
    }
}

 public class Producer extends Thread {
        private String producer;
        private Storage storage;

        public Producer(Storage storage) {
            this.storage = storage;
        }

        @Override
        public void run() {
            while (true) {
                produce(producer);
            }
        }

        public void produce(String producer) {
            storage.produce(producer);
        }

        public String getProducer() {
            return producer;
        }

        public void setProducer(String producer) {
            this.producer = producer;
        }

        public Storage getStorage() {
            return storage;
        }

        public void setStorage(Storage storage) {
            this.storage = storage;
        }
    }

    public class Consumer extends Thread {
        private String consumer;
        private Storage storage;

        public Consumer(Storage storage) {
            this.storage = storage;
        }

        @Override
        public void run() {
            while (true) {
                consume(consumer);
            }
        }

        public void consume(String consumer) {
            storage.consume(consumer);
        }

        public Storage getStorage() {
            return storage;
        }

        public void setStorage(Storage storage) {
            this.storage = storage;
        }

        public String getConsumer() {
            return consumer;
        }

        public void setConsumer(String consumer) {
            this.consumer = consumer;
        }
    }

await() / signal()方法

public class StorageLock {
    private Lock lock = new ReentrantLock();
    private Condition fullCondition = lock.newCondition();
    private Condition emptyCondition = lock.newCondition();

    private final int MAX_SIZE = 10;

    private LinkedList<Object> list = new LinkedList<>();

    public void produce(String name) {
        try {
            lock.lock();
            while (list.size() == MAX_SIZE) {
                fullCondition.await();
                System.out.println("仓库已满," + name + "暂停生产");
            }
            list.add(new Object());
            System.out.println(name + "生产一个,当前仓库容量" + list.size());
            emptyCondition.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void consume(String name) {
        try {
            lock.lock();
            while (list.size() == 0) {
                emptyCondition.await();
                System.out.println("仓库以空," + name + "暂停消费");
            }
            list.remove();
            System.out.println(name + "消费一个,当前仓库容量" + list.size());
            fullCondition.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

BlockingQueue阻塞队列方法


public class BlockStorage {
    private final int MAX_SIZE = 10;
    private ArrayBlockingQueue<Object> list = new ArrayBlockingQueue<Object>(MAX_SIZE);

    public void produce(String name) throws InterruptedException {
        if(list.size() == MAX_SIZE){
            System.out.println("仓库已满,【" + name + "】: 暂时不能执行生产任务!");
        }
        list.put(new Object());

        System.out.println("【" + name + "】:生产了一个产品\t【现仓储量为】:" + list.size());
    }

    public void consume(String name) throws InterruptedException {
        if(list.size() == 0){
            System.out.println("仓库空,【" + name + "】: 暂时不能执行消费任务!");
        }
        list.take();

        System.out.println("【" + name + "】:消费了一个产品\t【现仓储量为】:" + list.size());
    }

}
posted @ 2018-04-08 15:15  _星辰、  阅读(107)  评论(0编辑  收藏  举报