队列特性:
FIFO(first input first output 先进先出)
阻塞情况
1.对于写入,如果队列满了,就必须阻塞等待
2.对于读取,如果队列是空的,必须阻塞等待生产(写入)
阻塞队列 BlockingQueue 接口
父类是 Collection
实现类是 ArrayBlockingQueue 数组的
LinkedBlockingQueue 链表的
SynchronousQueue 同步队列的
结构:
使用阻塞队列
何时使用?
在多线程中,A线程等待B线程执行完成后执行
在线程池中,排序等待
如何使用?
添加,移除等操作,有四组api
第一组:抛出异常
第二组:不会抛出异常,有返回值
第三组:阻塞等待
第四组:超时等待
创建阻塞队列,同事设置队列大小
ArrayBlockingQueue abq = new ArrayBlockingQueue<>(3);
abq.add(“a”);
同步队列 SynchronousQueue
不存储元素(没有容量实际就是一个元素存在队列中)
必须进去一个元素,等待取出来之后,才能再往里面放一个元素
BlockingQueue<String> bq = new SynchrounousQueue<>(): // 创建同步队列
// 创建两个线程,一个写一个读
new Thread(()->{
try{
sout("输出");
bq.put("1");
}catch(){}
},"T1").start();
new Thread(()->{
try{
TimeUnit.SECONDS.sleep(3);
sout(bq.take())
}catch(){}
},"T2").start();