美文网首页
异步模式之生产者/消费者

异步模式之生产者/消费者

作者: 抬头挺胸才算活着 | 来源:发表于2020-03-16 21:00 被阅读0次

与前面的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应
消费队列可以用来平衡生产和消费的线程资源
生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据
消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据
JDK 中各种阻塞队列,采用的就是这种模式。

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * @program: offer
 * @description:
 * @author: liyuecheng
 * @create: 2020-06-03 10:24
 **/
public class MessageQueue {
    private Deque<String> queue = new LinkedList<>();
    private int capacity;

    public MessageQueue(int capacity) {
        this.capacity = capacity;
    }

    public String take(){
        synchronized (queue) {
            while (queue.size() == 0) {
                try {
                    queue.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            queue.notifyAll();
            return queue.removeFirst();
        }
    }

    public void put(String message){
        synchronized (queue){
            while (queue.size()==capacity){
                try {
                    queue.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            queue.addLast(message);
            queue.notifyAll();
        }
    }

    public static void main(String[] args) {
        MessageQueue mq = new MessageQueue(2);

        new Thread(
            ()->{
                while(true) {
                    String message = mq.take();
                    System.out.println("putThread get message:" + message);
                }
            }, "putThread"
        ).start();

        new Thread(
                ()->{
               System.out.println("takeThread put message");
               mq.put("1");
               System.out.println("takeThread put message");
               mq.put("2");
               System.out.println("takeThread put message");
               mq.put("3");
               System.out.println("takeThread put message");
               mq.put("4");
                }, "takeThread"
        ).start();
    }
}

相关文章

网友评论

      本文标题:异步模式之生产者/消费者

      本文链接:https://www.haomeiwen.com/subject/jejnehtx.html