阻塞队列
- 解耦合
- 削峰填谷
- 生产者消费者模型:
 
解耦合

削峰填谷

生产者消费者模型:
正常来说,wait通过notify唤醒,其他线程调用了take,在take的最后一步进行notify.
package thread;
class MyBlockingQueue{
    private String [] data=new String[1000];
    private volatile  int head=0;
    private volatile  int tail=0;
    private volatile  int size=0;
    private  final Object locker=new Object();
    public void put(String elem) throws InterruptedException {
        synchronized (this) {
            while (size == data.length) {
            //用while 让wait唤醒后还能再确认一次,是否条件成立
               this.wait();
            }
            data[tail] = elem;
            tail++;
            if (tail == data.length) {
                tail = 0;
            }
            size++;
            this.notify();
        }
    }
    public String take() throws InterruptedException {
        synchronized (this){
        while(size==0){
            this.wait();
        }
        String ret=data[head];
        head++;
        if(head==data.length){
            head=0;
        }
        size--;
        this.notify();
        return ret;
    }
}}
public class demo24 {
    public static void main(String[] args) {
        MyBlockingQueue queue= new MyBlockingQueue();
Thread t1=new Thread(()->{
while(true){
    try {
        String result=queue.take();
        System.out.println("消费元素"+result );
    } catch (InterruptedException e) {
        e.printStackTrace();
    }}
});
Thread t2=new Thread(()->{
    int num=1;
    while(true){
        try {
            queue.put(num+"");
            System.out.println("生产元素"+num);
            num++;
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});
t1.start();
t2.start();
    }
}




![[报错解决]SpringBoot子项目打jar包启动报 XXX--1.0-SNAPSHOT.jar中没有主清单属性](https://img-blog.csdnimg.cn/direct/a658915b781246ac825910593da6757c.png#pic_center)








![[iOS]从拾遗到Runtime(上)](https://img-blog.csdnimg.cn/direct/ecdc6b1172bd44518e275f37c6844f24.png)






