阻塞队列以及应用场景
1. 阻塞队列的应用场景 队列示意图 我们来看一个场景,监控文件变化的时候,我们开一个线程获取变化了的文件名,拿到之后我们会做解析,查找数据库等等其他操作。如果我们对这两个操作分开统计它们的处理时间,会发现后面的解析需要的时间远远大于前面得到文件名的时间。 文件监控与处理 这时如果监控文件变化的线程是每一秒轮询一次,假设操作1耗时1ms,操作2耗时有时正好与操作1加起来在一秒内,有时由于文件过大,解析时间过长超出了一秒,就会出现有文件被监控到发生了变化却来不及处理,所以这批文件变化被漏掉了。 把上面这个场景抽象化,就是在生产者消费者模型中,生产数据和消费数据的速率不一致,如果生产数据速度快一些,消费(处理)不过来,就会导致数据丢失。这时候我们就可以应用上阻塞队列来解决这个问题。 阻塞队列首先是一个队列,我们起单线程生产数据入队,起多线程消费数据。由于阻塞队列的特点:队空时消费阻塞,队满时生产阻塞。多线程消费数据起到了加速消费的作用,使得生产的数据不会在队里积压过多,而生产的数据也不会丢失处理了。 2. 阻塞队列 集合类 JDK7提供了7个阻塞队列。分别是 ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。 PriorityBlockingQueue