多生产者多消费者(第一种方式),基于synchronized,wait,notifyAll

生产者消费者模式描述的是协调与协作关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用 的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者(那个吃的)如果桌子空了的话就等待

采用生产者消费者模式可以做到异步,解耦的目的。

public class Produce implements Runnable {

    public Object lock;
    public LinkedList<String> list;
    
    private volatile boolean isRunning = true;

    private static AtomicInteger count = new AtomicInteger();
    
    public Produce(Object object, LinkedList<String> list) {
        this.lock = object;
        this.list = list;
    }

    @Override
    public void run() {
        try {
            while (isRunning) {
                Thread.sleep(1000);
                synchronized (lock) {
                    while (list.size() >= 5) {
                        System.out.println(Thread.currentThread().getName() + " 正在等待 ");
                        lock.wait();
                    }
                    String value = "data:"+count.getAndIncrement();
                    list.offerLast(value);
                    System.out.println(Thread.currentThread().getName() + " 生产数据 "+ value);
                    lock.notifyAll();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public void stop() {
        isRunning = false;
    }
}
public class Consumer implements Runnable {

    private volatile boolean isRunning = true;

    public Object lock;

    public LinkedList<String> list;// 用list存放生产之后的数据,最大容量为1

    public Consumer(Object object, LinkedList<String> list ) {
        this.lock = object;
        this.list = list;
    }

    @Override
    public void run() {
        try {
            while (isRunning) {
                synchronized (lock) {
                    while (list.isEmpty()) {
                        System.out.println(Thread.currentThread().getName() + " 正在等待");
                        lock.wait();
                    }
                    String value = list.pollFirst();
                    System.out.println(Thread.currentThread().getName() + " 消费数据 >>"+ value);
                    lock.notifyAll();// 
                }
                Thread.sleep(2000);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    public void stop() {
        isRunning = false;
    }
}
public class Client {

    public static void main(String[] args) {

        Object lock = new Object();
        LinkedList<String> list = new LinkedList<String>();

        IntStream.range(1, 4).forEach(i -> new Thread(new Produce(lock, list), "【生产者" + i + "").start());

        IntStream.range(1, 3).forEach(i -> new Thread(new Consumer(lock, list), "【消费者" + i + "").start());
    }

}
原文地址:https://www.cnblogs.com/moris5013/p/10913261.html