BlockingQueue之ArrayBlockingQueue类的测试

在Java中,BlockingQueue是一个接口,它的实现类有如下
・ArrayBlockingQueue、
ArrayBlockingQueue底层是使用一个数组实现队列的,并且在构造ArrayBlockingQueue时需要指定容量,
也就意味着底层数组一旦创建了,容量就不能改变了,因此ArrayBlockingQueue是一个容量限制的阻塞队列。
因此,在队列全满时执行入队将会阻塞,在队列为空时出队同样将会阻塞。
ArrayBlockingQueue的并发阻塞是通过ReentrantLock和Condition来实现的,ArrayBlockingQueue内部只有一把锁,
意味着同一时刻只有一个线程能进行入队或者出队的操作。
・DelayQueue、
 
・LinkedBlockingDeque、
・LinkedBlockingQueue、

LinkedBlockingQueue是一个基于链表实现的可选容量的阻塞队列。

队头的元素是插入时间最长的,队尾的元素是最新插入的。新的元素将会被插入到队列的尾部。 

LinkedBlockingQueue的容量限制是可选的,

如果在初始化时没有指定容量,那么默认使用int的最大值作为队列容量。

LinkedBlockingQueue中维持两把锁,一把锁用于入队,一把锁用于出队,这也就意味着,同一时刻,
只能有一个线程执行入队,其余执行入队的线程将会被阻塞;同时,可以有另一个线程执行出队,
其余执行出队的线程将会被阻塞。换句话说,虽然入队和出队两个操作同时均只能有一个线程操作,
但是可以一个入队线程和一个出队线程共同执行,也就意味着可能同时有两个线程在操作队列,
那么为了维持线程安全,LinkedBlockingQueue使用一个AtomicInterger类型的变量表示当前队列中含有的元素个数,
所以可以确保两个线程之间操作底层队列是线程安全的。
・PriorityBlockingQueue、
・SynchronousQueue等,
 
※它们的区别主要体现在存储结构上或对元素操作上的不同,
 但是对于take与put操作的原理,却是类似的。
 
以上内容摘自如下页面

作者:天外流星for
链接:https://www.jianshu.com/p/7b2f1fa616c6
来源:简书

=================================================

package t1;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThread25 {
public static void main(String[] args) {

final BlockingQueue<Character> bq = new ArrayBlockingQueue<>(26);
final ExecutorService es = Executors.newFixedThreadPool(2);
Runnable r = () -> {
for (char ch = 'A'; ch <= 'Z'; ch++) {
try {
bq.put(ch);
System.out.printf("%c produced by producer.%n", ch);// 能同步,但是输出顺序不能保证
} catch (InterruptedException e) {
}
}
};
es.execute(r);
Runnable r2 = () -> {
char ch = '\0';
do {
try {
ch = bq.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%c consumed by consumer.%n", ch);// 能同步,但是输出顺序不能保证
} while (ch != 'z');
};
es.execute(r2);
}
}

输出结果:

A produced by producer.
B produced by producer.
A consumed by consumer.
B consumed by consumer.
C consumed by consumer.
C produced by producer.
D produced by producer.
D consumed by consumer.
E consumed by consumer.
E produced by producer.
F produced by producer.
G produced by producer.
H produced by producer.
I produced by producer.
J produced by producer.
K produced by producer.
F consumed by consumer.
L produced by producer.
M produced by producer.
N produced by producer.
O produced by producer.
G consumed by consumer.
H consumed by consumer.
I consumed by consumer.
J consumed by consumer.
K consumed by consumer.
L consumed by consumer.
M consumed by consumer.
N consumed by consumer.
O consumed by consumer.
P consumed by consumer.
P produced by producer.
Q produced by producer.
Q consumed by consumer.
R consumed by consumer.
R produced by producer.
S produced by producer.
T produced by producer.
U produced by producer.
V produced by producer.
W produced by producer.
X produced by producer.
Y produced by producer.
Z produced by producer.
S consumed by consumer.
T consumed by consumer.
U consumed by consumer.
V consumed by consumer.
W consumed by consumer.
X consumed by consumer.
Y consumed by consumer.
Z consumed by consumer.

 

posted @ 2020-04-01 15:36  工设091  阅读(189)  评论(0)    收藏  举报