【Java多线程】 生产者消费者模式

201 阅读1分钟

三个生产者线程,一个消费者线程。
三个生产者线程将生产的Message放入到阻塞队列中,消费者线程从阻塞队列中获取值。

@Slf4j(topic = "c.mainTest")
public class MainTest {
    public static void main(String[] args){
        MessageQueue mq = new MessageQueue(2);
        new Thread(()->{
            while(true){
                try {
                    Thread.sleep(1000);
                    mq.put(new Message(1,"值1"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"生产者1").start();

        new Thread(()->{
            while(true){
                try {
                    Thread.sleep(1000);
                    mq.put(new Message(2,"值2"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"生产者2").start();

        new Thread(()->{
            while(true){
                try {
                    Thread.sleep(1000);
                    mq.put(new Message(3,"值3"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"生产者3").start();

        new Thread(()->{
            while(true){
                try {
                    Thread.sleep(300);
                    Message take = mq.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"消费者线程").start();

    }

}

@Slf4j(topic = "c.messageQueue")
class MessageQueue {

    //消息队列
    private LinkedList<Message> list = new LinkedList<>();
    //队列容量
    private int capacity;

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

    //获取消息
    public Message take() {
        synchronized (list) {
            while (list.isEmpty()) {
                try {
                    log.debug("队列空,消费者线程必须等待");
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //从队列的头部
            list.notifyAll();
            Message message = list.removeFirst();
            log.debug("取出消息:"+message);
            return message;
        }
    }

    //存入消息
    public void put(Message message) {
        synchronized (list){
            while(list.size()==capacity){
                try {
                    log.debug("队列满,生产者线程必须等待");
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            log.debug("放入消息:"+message);
            list.addLast(message);
            list.notifyAll();
        }
    }
}

final class Message {
    private int id;
    private Object value;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Message{" +
                "id=" + id +
                ", value=" + value +
                '}';
    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }

    public Message(int id, Object value) {
        this.id = id;
        this.value = value;
    }
}