【JUC】JUC并发编程(6)
前言:
本文内容:ReadWriteLock、阻塞队列BlockingQueue、BlockingQueue四组API
推荐免费JUC并发编程视频:【狂神说Java】JUC并发编程最新版通俗易懂_哔哩哔哩_bilibili
ReadWriteLock
一个ReadWriteLock
维护一对关联的locks
,一个用于只读操作,一个用于写入。read lock
可以由多个阅读器线程同时进行,只要没有作者,write lock
是独家的。
读可以多个线程同时读
写只能有一个线程去写
**独占锁(写锁)**一次只能被一个线程占有
共享锁(读锁) 多个线程可以同时占有
1 | package com.jokerdig.rw; |
运行结果
1 | 1写入中... |
阻塞队列BlockingQueue
阻塞和队列
写入:如果队列满了,就必须等待,直到队列有位置可以写入,中间的等待产生了阻塞。
读取:如果队列是空的,就必须等待,直到出现可以读取的内容,中间的等待产生了阻塞。
阻塞队列:BlockingQueue
BlockingQueue四组API
四组API
方式 | 抛出异常 | 有返回值 | 阻塞等待 | 超时等待 |
---|---|---|---|---|
添加 | add() | offer() | put() | offer(参数,时间,时间单位) |
移除 | remove() | poll() | take() | poll(时间,时间单位) |
判断队首元素 | element() | peek() | - | - |
代码测试
-
抛出异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// 抛出异常
public static void test1(){
// 队列的大小
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(arrayBlockingQueue.add("a"));
System.out.println(arrayBlockingQueue.add("b"));
System.out.println(arrayBlockingQueue.add("c"));
// 抛出异常 IllegalStateException: Queue full
// System.out.println(arrayBlockingQueue.add("d"));
// 查看队首的元素
System.out.println(arrayBlockingQueue.element());
System.out.println("==========================");
System.out.println(arrayBlockingQueue.remove());
System.out.println(arrayBlockingQueue.remove());
System.out.println(arrayBlockingQueue.remove());
// 抛出异常 java.util.NoSuchElementException
// System.out.println(arrayBlockingQueue.remove());
} -
不会抛出异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21// 不抛出异常
public static void test2(){
// 队列的大小
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(arrayBlockingQueue.offer("a"));
System.out.println(arrayBlockingQueue.offer("b"));
System.out.println(arrayBlockingQueue.offer("c"));
// false 返回布尔值 不抛出异常
// System.out.println(arrayBlockingQueue.offer("d"));
// 返回队首元素
System.out.println(arrayBlockingQueue.peek());
System.out.println("==============================");
System.out.println(arrayBlockingQueue.poll());
System.out.println(arrayBlockingQueue.poll());
System.out.println(arrayBlockingQueue.poll());
// 返回 null 不抛出异常
// System.out.println(arrayBlockingQueue.poll());
} -
阻塞等待
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 阻塞等待
public static void test3() throws InterruptedException {
// 队列的大小
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
arrayBlockingQueue.put("a");
arrayBlockingQueue.put("b");
arrayBlockingQueue.put("c");
// 队列没有位置 它会一直阻塞
// arrayBlockingQueue.put("d");
System.out.println("==============================");
System.out.println(arrayBlockingQueue.take());
System.out.println(arrayBlockingQueue.take());
System.out.println(arrayBlockingQueue.take());
// 队列没有位置 它会一直阻塞
// System.out.println(arrayBlockingQueue.take());
} -
超时等待
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 超时等待
public static void test4() throws InterruptedException {
// 队列的大小
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
arrayBlockingQueue.offer("a");
arrayBlockingQueue.offer("b");
arrayBlockingQueue.offer("c");
// 超时等待 设置时间,时间结束如果还在阻塞就直接退出
arrayBlockingQueue.offer("d",3,TimeUnit.SECONDS);
System.out.println("==============================");
System.out.println(arrayBlockingQueue.poll());
System.out.println(arrayBlockingQueue.poll());
System.out.println(arrayBlockingQueue.poll());
// 超时等待 设置时间,时间结束如果还在阻塞就直接退出
System.out.println(arrayBlockingQueue.poll(3,TimeUnit.SECONDS));
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hey,Joker!
评论
ValineTwikoo