Java 多线程编程 生产者 消费者模式 (synchronized同步/ wait等待/ notify唤醒)

Java 多线程编程 生产者 消费者模式

1. 消息类

  • 消息数超过存放最大数, 则生产者线程阻塞(等待消费者消费后唤醒)
  • 消息数等于空, 则消费者线程阻塞(等待生产者生产后唤醒)

public class Message {
    /** 当前消息数量*/
    private int count = 0;
    /** 信息存放最大限数*/
    private int maximum = 20;

    /**
     * 生产消息
     * */
    public synchronized void set() {
        if (count <= maximum) {
            /** 生产一个消息*/
            System.out.println("生产者 线程" + Thread.currentThread().getName() + "生产了一个消息, 当前有" + (++count) + "个消息");
            /** 通知等待的消费者*/
            super.notify();
        } else {
            try {
                /**
                 * 如果当前消息大于 maximum信息最大数
                 * 生产者进入睡眠/等待状态
                 * */
                super.wait();
                System.out.println("生产者 线程" + Thread.currentThread().getName() + "进入睡眠");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 消费消息
     * */
    public synchronized void get() {
        if (count > 0) {
            /** 消费一个消息*/
            System.out.println("消费者 线程" + Thread.currentThread().getName() + "消费了一个消息, 当前有" + (--count) + "个消息");
            /** 通知等待的生产者*/
            super.notify();
        } else {
            try {
                /** 如果没有消息, 消费者进入睡眠/等待状态*/
                super.wait();
                System.out.println("消费者 线程" + Thread.currentThread().getName() + "进入睡眠");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

2. 生产者类


public class Producer implements Runnable {
    private Message message;
    public Producer(Message message) {
        this.message = message;
    }

    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            message.set();
        }
    }

}

3. 消费者类


public class Consumer implements Runnable {
    private Message message;
    public Consumer(Message message) {
        this.message = message;
    }

    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            message.get();
        }
    }

}

Runnable是接口, Thread是 Runnable的实现类, 由于 Java对多接口实现比较灵活, 开发多线程时建议实现 Runnable接口. 启动时用 Thread的 start(). 例: new Thread().start()

4. App.java


public class App {
    public static void main(String[] args) {
        final Message message = new Message();
        /** 建几个生产线程*/
        new Thread(new Producer(message)).start();
        new Thread(new Producer(message)).start();
        new Thread(new Producer(message)).start();
        /** 建几个消费线程*/
        new Thread(new Consumer(message)).start();
        new Thread(new Consumer(message)).start();
        new Thread(new Consumer(message)).start();
        new Thread(new Consumer(message)).start();
    }

}

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

发布了62 篇原创文章 · 获赞 325 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qcl108/article/details/101769139