java多线程:BlockingQueue
Queue队列遵循了先进先出的原则
BlockingQueue继承了Queue
可以通过IDEA的UML图看出彼此的关系:
BlockingQueue :阻塞队列
向队列尾添加元素(put()方法)时,若队列已经塞满,则当前线程会被阻塞,直到队列中元素被消费,出现空余位置,则线程继续工作
向队列头取元素(take()方法)时,若队列为空,则当前线程会被阻塞,直到队列中出现新的元素,当前线程才会继续工作。
测试:
创建测试类:Test
创建Test私有属性 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(); }
执行结果:
可以看出来,先生成的数据,先消费