2020-08-28

阻塞队列笔记

1.阻塞队列的应用场景
在这里插入图片描述
我们来看这个场景,监控问及那变化的时候,我们开一个线程获取变化了的文件名,拿到之后我们会做解析,查找数据等等其它操作。如果我们对这两个操作分开统计他们的处理时间,会发现后面的解析时间远远大于前面得到的文件名的时间。
在这里插入图片描述
这时如果监控文件变化的线程是每秒轮询一次,假设操作1耗时1ms,操作2耗时正好与操作1加起来在一秒内,有事由于文件过大,解析时间过长超出一秒,就会出现有文件被监控到发生了变化去来不及处理,所以这批文件变化被漏掉了。
把上面这个场景抽象化,就是在生产者消费者模型中,生产数据和消费数据的速率不一样,如果生产速度快一些,消费处理不过来,就会导致数据丢失,这时候我们就应该用阻塞队列来解决这个问题。
阻塞队列首先是一个队列,我们起单线程生产数据入队,起多线程消费数据。由于阻塞队列的特点:队空是消费阻塞,队满时生产阻塞。多线程消费数据起到了加速消费的作用,使得生产的数据不会再队里积压过多,而生产的数据也不会丢失处理了

2.阻塞队列 集合类
JDK7提供了7个阻塞队列。分别是
ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
PriorityBlockingQueue:一个使用优先级队列实现的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列。
SynchronouwQueue:一个不存储元素的阻塞队列。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
3.举个栗子
下面的实例展示了如何使用阻塞队列来控制线程集。程序在一个目录及它的所有子目录下搜索所有文件,打印出包含指定关键字的文件列表。从下面实例可以看出,使用阻塞队列两个显着的好处就是:多线程操作共同的队列时不需要额外的同步,另外就是队列会自动平衡负载,即那边(生产与消费两边)处理快了就会被阻塞掉,从而减少两边的处理速度差距。
下面是具体实现:
Java代码
public class BlockingQueueTest {
public static void main(String[] args) {
Scanner in = new Scanner(System。
in);
System。out。print("Enter base directory (e。g。 /usr/local/jdk5。0/src): ");
String directory = in。nextLine();
System。
out。print("Enter keyword (e。g。 volatile): ");
String keyword = in。nextLine();
final int FILE_QUEUE_SIZE = 10;// 阻塞队列大小
final int SEARCH_THREADS = 100;// 关键字搜索线程个数
// 基于ArrayBlockingQueue的阻塞队列
BlockingQueue queue = new ArrayBlockingQueue(
FILE_QUEUE_SIZE);
//只启动一个线程来搜索目录
FileEnumerationTask enumerator = new FileEnumerationTask(queue,
new File(directory));
new Thread(enumerator)。
start();
//启动100个线程用来在文件中搜索指定的关键字
for (int i = 1; i queue;
private File startingDirectory;
public FileEnumerationTask(BlockingQueue queue, File startingDirectory) {
this。
queue = queue;
this。startingDirectory = startingDirectory;
}。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个 SQL 语句,用于向借阅表中插入数据。该表包含以下字段:借阅编号、读者编号、书籍编号、借阅日期、归还日期、借阅状态。每条数据表示一次借阅记录。其中借阅编号、读者编号、书籍编号、借阅日期和借阅状态是必填项,归还日期为可选项,如果借阅状态为“已还”则必须填写归还日期。 具体插入的数据如下: - 借阅编号:100001,读者编号:123413,书籍编号:0001,借阅日期:2020-11-05,归还日期:NULL,借阅状态:借阅 - 借阅编号:100002,读者编号:223411,书籍编号:0002,借阅日期:2020-9-28,归还日期:2020-10-13,借阅状态:已还 - 借阅编号:100003,读者编号:321123,书籍编号:1001,借阅日期:2020-7-01,归还日期:NULL,借阅状态:过期 - 借阅编号:100004,读者编号:321124,书籍编号:2001,借阅日期:2020-10-09,归还日期:2020-10-14,借阅状态:已还 - 借阅编号:100005,读者编号:321124,书籍编号:0001,借阅日期:2020-10-15,归还日期:NULL,借阅状态:借阅 - 借阅编号:100006,读者编号:223411,书籍编号:2001,借阅日期:2020-10-16,归还日期:NULL,借阅状态:借阅 - 借阅编号:100007,读者编号:411111,书籍编号:1002,借阅日期:2020-9-01,归还日期:2020-9-24,借阅状态:已还 - 借阅编号:100008,读者编号:411111,书籍编号:0001,借阅日期:2020-9-25,归还日期:NULL,借阅状态:借阅 - 借阅编号:100009,读者编号:411111,书籍编号:1001,借阅日期:2020-10-08,归还日期:NULL,借阅状态:借阅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值