多线程之间的交互:线程阀

线程阀是一种线程与线程之间互相制约和交互的机制

Queue,Deque,BlockingQueue

Queue队列,先进先出;Deque双端队列;BlockingQueue当队列满时,存储元素的线程会等待队列非满,当队列为空时,读取元素的线程会等待队列非空。

阻塞队列方法

JDK已知阻塞队列

 数组阻塞队列java.util.concurrent.ArrayBlockingQueue

链表阻塞队列java.util.concurrent.LinkedBlockingQueue

基于链表的阻塞队列,当生产者向其中存储值时,队列会从其中获取到值放入队列内部缓存,生产者立即返回,当缓存区满时,会阻塞生产队列,直到消费者消费一份数据。消费者亦是如此。

该队列生产者和消费者分别加锁,意味着生产者和消费者可以同时从队列中操作数据,适合于并发模式。

当初始化我们没有给定大小时,默认最大,如果生产者生产数据的速度高于消费者,可能会导致内存泄漏。

优先级阻塞队列java.util.concurrent.PriorityBlockingQueue

支持优先级排序的无阻塞队列,并不会阻塞生产者,只会阻塞消费者。

延时队列java.util.concurrent.DelayQueue

支持延时获取元素的使用优先级队列实现的无界阻塞队列,队列中元素必须实现DelayQueue,和Compable接口创建元素的时候可以指定多久才可以获取到。

同步队列java.util.concurrent.SynchronousQueue

同步队列没有实际内存,只是负责将生产者生产的数据传递给消费者。吞吐量较高

链表双向阻塞队列java.util.concurrent.LinkedBlockingDeque

由链表组成的双向阻塞队列

链表传输队列java.util.concurrent.LinkedTransferQueue

消费者去队列消费数据,发现队列为空,生产一个数据赋值为null,继续等待知道有生产者生产数据发现有空数据,将自己的值直接赋值给空的数据。

CountDownLatch同步计数器

一个线程等待其他线程都完成后才能继续往下走

AbstractQueuedLongSynchronizer抽象队列化同步器

Semaphore同步计数器

只允许一定数量的线程工作,其余的进行等待,完成一个线程,允许放入一个线程。

CyclicBarrier同步计数器

多个线程互相等待,所有线程到达某一点时,才能继续同时往下走

 

 

你可能感兴趣的:(JAVA并发编程从入门到精通,线程阀)