Skip to content

Commit 62fe44c

Browse files
committed
结构调整
1 parent 54bb9f9 commit 62fe44c

35 files changed

+745
-661
lines changed

README.md

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,8 @@
243243

244244
## Java并发编程
245245

246-
- [二哥的并发编程进阶之路小册简介](docs/thread/readme.md)
247-
- [创建Java线程的3种方式](docs/thread/wangzhe-thread.md)
246+
- [并发编程小册简介](docs/thread/readme.md)
247+
- [Java多线程入门](docs/thread/wangzhe-thread.md)
248248
- [获取线程的执行结果](docs/thread/callable-future-futuretask.md)
249249
- [Java线程的6种状态及切换](docs/thread/thread-state-and-method.md)
250250
- [线程组和线程优先级](docs/thread/thread-group-and-thread-priority.md)
@@ -257,7 +257,7 @@
257257
- [JDK15 移除了偏向锁](docs/thread/pianxiangsuo.md)
258258
- [CAS详解](docs/thread/cas.md)
259259
- [AQS详解](docs/thread/aqs.md)
260-
- [JUC 包下的那些锁](docs/thread/lock.md)
260+
- [锁分类及 JUC 包下的那些锁](docs/thread/lock.md)
261261
- [重入锁ReentrantLock](docs/thread/reentrantLock.md)
262262
- [读写锁ReentrantReadWriteLock](docs/thread/ReentrantReadWriteLock.md)
263263
- [协作类Condition](docs/thread/condition.md)
@@ -530,14 +530,23 @@
530530

531531
> 从购买阿里云服务器+域名购买+域名备案+HTTP 升级到 HTTPS,全方面记录《二哥的Java进阶之路》知识库的诞生和改进过程,涉及到 docsify、Git、Linux 命令、GitHub 仓库等实用知识点。
532532
533-
534533
- [购买云服务器](docs/szjy/buy-cloud-server.md)
535534
- [安装宝塔面板](docs/szjy/install-baota-mianban.md)
536535
- [购买域名&域名解析](docs/szjy/buy-domain.md)
537536
- [备案域名](docs/szjy/record-domain.md)
538537
- [给域名配置HTTPS证书](docs/szjy/https-domain.md)
539538
- [使用docsify+Git+GitHub+码云+阿里云服务器搭建知识库网站](docs/szjy/tobebetterjavaer-wangzhan-shangxian.md)
540539

540+
本知识库使用 VuePress 搭建,并基于[VuePress Theme Hope](https://theme-hope.vuejs.press/zh/)主题,你可以把[仓库](https://github.com/itwanger/toBeBetterJavaer)拉到本地后直接通过 `npm run docs:dev` 跑起来。
541+
542+
>前提是你已经安装好 node.js 和 npm 环境。
543+
544+
![](https://cdn.tobebetterjavaer.com/stutymore/README-20230829162211.png)
545+
546+
点击链接就可以在本地看到运行后的效果了。
547+
548+
![](https://cdn.tobebetterjavaer.com/stutymore/README-20230829162301.png)
549+
541550

542551
# 联系作者
543552

docs/.vuepress/sidebar.ts

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -281,37 +281,38 @@ export const sidebarConfig = sidebar({
281281
collapsible: true,
282282
prefix: "thread/",
283283
children: [
284-
"wangzhe-thread",
285-
"callable-future-futuretask",
286-
"thread-state-and-method",
287-
"thread-group-and-thread-priority",
288-
"why-need-thread",
289-
"thread-bring-some-problem",
290-
"jmm",
291-
"volatile",
292-
"synchronized-1",
293-
"synchronized",
294-
"pianxiangsuo",
295-
"cas",
296-
"aqs",
297-
"lock",
298-
"reentrantLock",
299-
"ReentrantReadWriteLock",
300-
"condition",
301-
"LockSupport",
302-
"map",
303-
"ConcurrentHashMap",
304-
"ConcurrentLinkedQueue",
305-
"BlockingQueue",
306-
"CopyOnWriteArrayList",
307-
"ThreadLocal",
308-
"pool",
309-
"ScheduledThreadPoolExecutor",
310-
"atomic",
311-
"Unsafe",
312-
"CountDownLatch",
313-
"fork-join",
314-
"shengchanzhe-xiaofeizhe",
284+
"readme",
285+
"wangzhe-thread",
286+
"callable-future-futuretask",
287+
"thread-state-and-method",
288+
"thread-group-and-thread-priority",
289+
"why-need-thread",
290+
"thread-bring-some-problem",
291+
"jmm",
292+
"volatile",
293+
"synchronized-1",
294+
"synchronized",
295+
"pianxiangsuo",
296+
"cas",
297+
"aqs",
298+
"lock",
299+
"reentrantLock",
300+
"ReentrantReadWriteLock",
301+
"condition",
302+
"LockSupport",
303+
"map",
304+
"ConcurrentHashMap",
305+
"ConcurrentLinkedQueue",
306+
"BlockingQueue",
307+
"CopyOnWriteArrayList",
308+
"ThreadLocal",
309+
"pool",
310+
"ScheduledThreadPoolExecutor",
311+
"atomic",
312+
"Unsafe",
313+
"CountDownLatch",
314+
"fork-join",
315+
"shengchanzhe-xiaofeizhe",
315316
],
316317
},
317318
{

docs/home.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ head:
4545

4646
如果你更喜欢离线的 PDF 版本,戳这个链接获取[👍二哥的 Java 进阶之路.pdf](https://javabetter.cn/overview/)
4747

48-
**转载须知**以下所有文章如非文首说明为转载皆为我(沉默王二)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
48+
**转载须知**以下所有文章如非文末说明为转载皆为我(沉默王二)的原创,如果你需要转载,请在文末注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
4949

5050
## 知识库地图
5151

@@ -252,9 +252,10 @@ head:
252252

253253
### Java并发编程
254254

255-
- [创建Java线程的3种方式](thread/wangzhe-thread.md)
255+
- [并发编程小册简介](thread/readme.md)
256+
- [Java多线程入门](thread/wangzhe-thread.md)
256257
- [获取线程的执行结果](thread/callable-future-futuretask.md)
257-
- [Java线程的6种状态及切换](thread/thread-state-and-method.md)
258+
- [Java线程的6种状态](thread/thread-state-and-method.md)
258259
- [线程组和线程优先级](thread/thread-group-and-thread-priority.md)
259260
- [进程与线程的区别](thread/why-need-thread.md)
260261
- [多线程带来了哪些问题?](thread/thread-bring-some-problem.md)
@@ -265,7 +266,7 @@ head:
265266
- [JDK15 移除了偏向锁](thread/pianxiangsuo.md)
266267
- [CAS详解](thread/cas.md)
267268
- [AQS详解](thread/aqs.md)
268-
- [JUC 包下的那些锁](thread/lock.md)
269+
- [锁分类及 JUC 包下的那些锁](thread/lock.md)
269270
- [重入锁ReentrantLock](thread/reentrantLock.md)
270271
- [读写锁ReentrantReadWriteLock](thread/ReentrantReadWriteLock.md)
271272
- [协作类Condition](thread/condition.md)

docs/thread/BlockingQueue.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ head:
1212
content: Java,并发编程,多线程,Thread,BlockingQueue
1313
---
1414

15-
# 14.22 阻塞队列 BlockingQueue
15+
# 第二十二节:阻塞队列 BlockingQueue
1616

1717
BlockingQueue 是 Java 中的一个接口,它代表了一个线程安全的队列,不仅可以由多个线程并发访问,还添加了等待/通知机制,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。
1818

1919
最常用的"[生产者-消费者](https://javabetter.cn/thread/shengchanzhe-xiaofeizhe.html)"问题中,队列通常被视作线程间的数据容器,生产者将“生产”出来的数据放入数据容器,消费者从“数据容器”中获取数据,这样,生产者线程和消费者线程就解耦了,各自只需要专注自己的业务即可。
2020

2121
阻塞队列(BlockingQueue)被广泛用于“生产者-消费者”问题中,其原因是 BlockingQueue 提供了可阻塞的插入和移除方法。**当队列容器已满,生产者线程会被阻塞,直到队列未满;当队列容器为空时,消费者线程会被阻塞,直至队列非空时为止**
2222

23-
### 基本操作
23+
## 基本操作
2424

2525
BlockingQueue 接口定义的方法如下所示:
2626

@@ -55,7 +55,7 @@ BlockingQueue 接口定义的方法如下所示:
5555

5656

5757

58-
### ArrayBlockingQueue
58+
## ArrayBlockingQueue
5959

6060
BlockingQueue 接口的实现类有 ArrayBlockingQueue、DelayQueue、LinkedBlockingDeque、LinkedBlockingQueue、LinkedTransferQueue、PriorityBlockingQueue、SynchronousQueue 等,我们先从 ArrayBlockingQueue 说起。
6161

@@ -126,7 +126,7 @@ public ArrayBlockingQueue(int capacity, boolean fair) {
126126
}
127127
```
128128

129-
#### 1)put 方法详解
129+
### 1)put 方法详解
130130

131131
`put(E e)`方法源码如下:
132132

@@ -166,7 +166,7 @@ private void enqueue(E x) {
166166

167167
enqueue 方法的逻辑同样很简单,先插入数据(`items[putIndex] = x`),然后通知被阻塞的消费者线程:当前队列中有数据可供消费(`notEmpty.signal()`)了。
168168

169-
#### 2)take 方法详解
169+
### 2)take 方法详解
170170

171171
take 方法的源码如下:
172172

@@ -262,7 +262,7 @@ public class ArrayBlockingQueueTest {
262262
![](https://cdn.tobebetterjavaer.com/stutymore/BlockingQueue-20230818155804.png)
263263

264264

265-
### LinkedBlockingQueue
265+
## LinkedBlockingQueue
266266

267267
LinkedBlockingQueue 是一个基于链表的线程安全的阻塞队列:
268268

@@ -334,7 +334,7 @@ static class Node<E> {
334334

335335
03)`Node(E x)`: 这是节点类的构造方法,它接受一个元素 x 并将其赋值给 item 字段。
336336

337-
#### 1)put 方法详解
337+
### 1)put 方法详解
338338

339339
put 方法源码如下:
340340

@@ -399,7 +399,7 @@ put 方法的逻辑基本上和 ArrayBlockingQueue 的一样。
399399

400400
09)可能的唤醒消费者线程:如果插入操作将队列从空变为非空(`c == 0`),则调用 `signalNotEmpty();` 唤醒可能正在等待非空队列的消费者线程。
401401

402-
#### 2)take 方法详解
402+
### 2)take 方法详解
403403

404404
take 方法的源码如下:
405405

@@ -452,7 +452,7 @@ public E take() throws InterruptedException {
452452

453453
09)返回取出的元素:最后返回被取出的元素 x。
454454

455-
#### 3)LinkedBlockingQueue 的使用示例
455+
### 3)LinkedBlockingQueue 的使用示例
456456

457457
```java
458458
public class LinkedBlockingQueueTest {
@@ -497,7 +497,7 @@ public class LinkedBlockingQueueTest {
497497

498498
![](https://cdn.tobebetterjavaer.com/stutymore/BlockingQueue-20230818212205.png)
499499

500-
### ArrayBlockingQueue 与 LinkedBlockingQueue 的比较
500+
## ArrayBlockingQueue 与 LinkedBlockingQueue 的比较
501501

502502
**相同点**:ArrayBlockingQueue 和 LinkedBlockingQueue 都是通过 [Condition](https://javabetter.cn/thread/condition.html) 通知机制来实现可阻塞的插入和删除。
503503

@@ -506,7 +506,7 @@ public class LinkedBlockingQueueTest {
506506
1. ArrayBlockingQueue 基于数组实现,而 LinkedBlockingQueue 基于链表实现;
507507
2. ArrayBlockingQueue 使用一个单独的 ReentrantLock 来控制对队列的访问,而 LinkedBlockingQueue 使用两个锁(putLock 和 takeLock),一个用于放入操作,另一个用于取出操作。这可以提供更细粒度的控制,并可能减少线程之间的竞争。
508508

509-
### PriorityBlockingQueue
509+
## PriorityBlockingQueue
510510

511511
PriorityBlockingQueue 是一个具有优先级排序特性的无界阻塞队列。元素在队列中的排序遵循自然排序或者通过提供的比较器进行定制排序。你可以通过实现 [Comparable](https://javabetter.cn/basic-extra-meal/comparable-omparator.html) 接口来定义自然排序。
512512

@@ -553,7 +553,7 @@ Medium priority task
553553
Low priority task
554554
```
555555

556-
### SynchronousQueue
556+
## SynchronousQueue
557557

558558
SynchronousQueue 是一个非常特殊的阻塞队列,它不存储任何元素。每一个插入操作必须等待另一个线程的移除操作,反之亦然。因此,SynchronousQueue 的内部实际上是空的,但它允许一个线程向另一个线程逐个传输元素。
559559

@@ -599,7 +599,7 @@ Put successfully: SYNCHRONOUS_EVENT
599599
Taken: SYNCHRONOUS_EVENT
600600
```
601601

602-
### LinkedTransferQueue
602+
## LinkedTransferQueue
603603

604604
LinkedTransferQueue 是一个基于链表结构的无界传输队列,实现了 TransferQueue 接口,它提供了一种强大的线程间交流机制。它的功能与其他阻塞队列类似,但还包括“转移”语义:允许一个元素直接从生产者传输给消费者,如果消费者已经在等待。如果没有等待的消费者,元素将入队。
605605

@@ -649,7 +649,7 @@ public class LinkedTransferQueueDemo {
649649
消费者收到: Hello, World!
650650
```
651651

652-
### LinkedBlockingDeque
652+
## LinkedBlockingDeque
653653

654654
LinkedBlockingDeque 是一个基于链表结构的双端阻塞队列。它同时支持从队列头部插入和移除元素,也支持从队列尾部插入和移除元素。因此,LinkedBlockingDeque 可以作为 FIFO 队列或 LIFO 队列来使用。
655655

@@ -690,7 +690,7 @@ Item3
690690
Item2
691691
```
692692

693-
### DelayQueue
693+
## DelayQueue
694694

695695
DelayQueue 是一个无界阻塞队列,用于存放实现了 Delayed 接口的元素,这些元素只能在其到期时才能从队列中取走。这使得 DelayQueue 成为实现时间基于优先级的调度服务的理想选择。
696696

@@ -747,7 +747,7 @@ public class DelayQueueDemo {
747747
这是一个 5 秒延迟的元素
748748
```
749749

750-
### 总结
750+
## 总结
751751

752752
本文介绍了 Java 中的阻塞队列,包括 ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue、LinkedTransferQueue、LinkedBlockingDeque 和 DelayQueue。它们都是线程安全的,可以在多线程环境下使用。
753753

0 commit comments

Comments
 (0)