java多线程:BlockingQueue

Queue队列遵循了先进先出的原则

BlockingQueue继承了Queue

可以通过IDEA的UML图看出彼此的关系:

java多线程:BlockingQueue

BlockingQueue :阻塞队列

向队列尾添加元素(put()方法)时,若队列已经塞满,则当前线程会被阻塞,直到队列中元素被消费,出现空余位置,则线程继续工作

向队列头取元素(take()方法)时,若队列为空,则当前线程会被阻塞,直到队列中出现新的元素,当前线程才会继续工作。

测试:

创建测试类:Test

创建Test私有属性 BlockingQueue

java多线程:BlockingQueue

构造方法创建实例:

java多线程:BlockingQueue

生产数据:

public void generate() throws InterruptedException {
    int i = 0;
    while (true) {
        i++;
        queue.put("asdasd"+i);
        System.out.println();
        System.out.println("生产数据:asdasd"+i);
    }
}

消费数据:

public void customer() throws InterruptedException {
    while (true) {
        Thread.sleep(3000);
        System.out.println("消费数据:"+queue.take());
    }
}

Main方法中创建两个线程,一个线程负责生成数据,一个线程负责消费数据:

public static void main(String[] args) throws InterruptedException {
    Test test = new Test();
    new Thread(()->{
        try {
            test.generate();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
    new Thread(()->{
        try {
            test.customer();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();

}

执行结果:

java多线程:BlockingQueue

可以看出来,先生成的数据,先消费