BlockingQueue
1. 队列(Queue)和List、Set都同属于集合(collection)。

2. 阻塞:什么情况下肯定会阻塞!
当队列是满的,添加元素就会被阻塞。
当队列是空的,获取元素就会被阻塞。
3. 为啥要用阻塞队列?
线程间通信不需要关心唤醒时
4. 4组API
| 抛出异常 | 返回一个布尔值,不会抛出异常 | 延时等待 | 一直等待 | |
|---|---|---|---|---|
| 插入 | add() | offer(e) | offer(e,time) | put() |
| 取出 |
remove() |
poll() | poll(time) | take() |
| 检查 | element() | peek() | - |
5. SynchronousQueue 简单实现生产消费模式
1 public class SynchronousQueueDemo { 2 public static void main(String[] args) { 3 BlockingQueue<String> queue = new SynchronousQueue<>(); 4 5 new Thread(() -> { 6 try { 7 // System.out.println(Thread.currentThread().getName() + " put a"); 8 // queue.put("a"); 9 // System.out.println(Thread.currentThread().getName() + " put b"); 10 // queue.put("b"); 11 // System.out.println(Thread.currentThread().getName() + " put c"); 12 // queue.put("c"); 13 for (int i = 0; i < 10; i++) { 14 System.out.println("producer" + " has produced:" + i); 15 queue.put(i + ""); 16 } 17 18 } catch (InterruptedException e) { 19 e.printStackTrace(); 20 } 21 22 }, "producer").start(); 23 24 new Thread(() -> { 25 try { 26 // TimeUnit.SECONDS.sleep(3); 27 // System.out.println(Thread.currentThread().getName() + " get " + queue.take()); 28 // TimeUnit.SECONDS.sleep(3); 29 // System.out.println(Thread.currentThread().getName() + " get " + queue.take()); 30 // TimeUnit.SECONDS.sleep(3); 31 // System.out.println(Thread.currentThread().getName() + " get " + queue.take()); 32 for (int i = 0; i < 10; i++) { 33 TimeUnit.SECONDS.sleep(3); 34 System.out.println("consumer" + " has consumed:" + queue.take()); 35 } 36 37 } catch (InterruptedException e) { 38 e.printStackTrace(); 39 } 40 }, "consumer").start(); 41 42 } 43 }

浙公网安备 33010602011771号