Java生产者消费者模式

生产者不断向队列中添加数据,消费者不断从队列中获取数据。
如果队列满了,则生产者不能添加数据;如果队列为空,则消费者不能获取数据。
通过实现了BlockingQueue接口的LinkedBlockingQueue来模拟同步。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class test {
    private static final int capacity = 5;
    private static final int time = 1000;

    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<>(capacity);
        Producer p1 = new Producer("p1", blockingQueue);
        Producer p2 = new Producer("p2", blockingQueue);
        Producer p3 = new Producer("p3", blockingQueue);
        Consumer c1 = new Consumer("c1", blockingQueue);
        Consumer c2 = new Consumer("c2", blockingQueue);

        p1.start();
        p2.start();
        p3.start();
        c1.start();
        c2.start();
    }

    public static class Producer extends Thread {
        private BlockingQueue<String> blockingQueue;

        public Producer(String name, BlockingQueue<String> blockingQueue) {
            super(name);
            this.blockingQueue = blockingQueue;
        }

        @Override
        public void run() {
            while (true) {
                try {
                    this.blockingQueue.put(currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                try {
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static class Consumer extends Thread {
        private BlockingQueue<String> blockingQueue;

        public Consumer(String name, BlockingQueue<String> blockingQueue) {
            super(name);
            this.blockingQueue = blockingQueue;
        }

        @Override
        public void run() {
            while (true) {
                String name = null;
                try {
                    name = this.blockingQueue.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(name);

                try {
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

执行结果

p1
p2
p3
p2
p1
p3

 

posted on 2023-02-19 21:56  王景迁  阅读(30)  评论(0)    收藏  举报

导航