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 }

 

posted @ 2020-03-07 16:31  jk2330  阅读(89)  评论(0)    收藏  举报