生产者消费者模型

生产者消费者模型

 

1. 生产者消费者模型优点

未理解 ! 

 

2. 标准库提供的阻塞队列

查看代码
 
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

class Test {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

        Thread t1 = new Thread( () -> {
            int count = 0;
            while (true) {
                try {
                    queue.put(count);
                    System.out.println("生产: " + count++);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        Thread t2 = new Thread( () -> {
            while (true) {
                try {
                    System.out.println("消费: " + queue.take());
                    //Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t1.start();
        t2.start();
    }
}

 

 3. 自己写的阻塞队列

重要细节:

1. put、take 操作加锁

2.  由wait()导致进入阻塞的线程, 也可以被interrupt 打断 -> 加 while ()


class MyBlockingQueue {

    public volatile int l;
    public volatile int r;
    public volatile int size;
    public int[] queue;

    public MyBlockingQueue(int n) {
        this.queue = new int[n];
    }

    public void put(int v) throws InterruptedException {
        synchronized (this) {
            while (size >= queue.length) {
                this.wait();
            }
            queue[r] = v;
            r = r == (queue.length - 1) ? 0 : ++r;
            size++;
            this.notify();
        }
    }

    public int take() throws InterruptedException {
        synchronized (this) {
            while (size == 0) {
                this.wait();
            }
            int v = queue[l];
            l = l == (queue.length - 1) ? 0 : ++l;
            size--;

            // 唤醒
            this.notify();
            return v;
        }
    }
}

class Test {
    public static void main(String[] args) {
        MyBlockingQueue queue = new MyBlockingQueue(100);

        Thread t1 = new Thread( () -> {
            int count = 0;
            while (true) {
                try {
                    queue.put(count);
                    System.out.println("生产: " + count);
                    count++;
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        Thread t2 = new Thread(() -> {
            while (true) {
                try {
                    System.out.println("消费 " + queue.take());
                    //Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        t1.start();
        t2.start();
    }
}

 

posted @ 2024-07-16 17:56  qyx1  阅读(25)  评论(0)    收藏  举报