队列是什么?队列以一种先进先出的方式管理数据
如果你试图向一个已经满了的阻塞队列中添加一个元素
或是从一个空的阻塞队列中移除一个元素
将导致线程阻塞
在多线程进行合作时
阻塞队列是很有用的工具
工作者线程可以定期的把中间结果存到阻塞队列中
而其他工作者线程把中间结果取出并在将来修改它们
队列会自动平衡负载
如果第一个线程集运行的比第二个慢
则第二个线程集在等待结果时就会阻塞
如果第一个线程集运行的快
那么它将等待第二个线程集赶上来
下面的程序展示了如何使用阻塞队列来控制线程集程序在一个目录及它的所有子目录下搜索所有文件打印出包含指定关键字的文件列表
ncurrent包提供了阻塞队列的个变种LinkedBlockingQueueArrayBlockingQueuePriorityBlockingQueue和DelayQueue我们用的是ArrayBlockingQueueArrayBlockingQueue在构造时需要给定容量并可以选择是否需要公平性如果公平参数被设置了等待时间最长的线程会优先得到处理通常公平性会使你在性能上付出代价只有在的确非常需要的时候再使用它
生产者线程枚举在所有子目录下的所有文件并把它们放到一个阻塞队列中这个操作很快如果队列没有设上限的话很快它就包含了没有找到的文件
我们同时还启动了大量的搜索线程每个搜索线程从队列中取出一个文件打开它打印出包含关键字的所有行然后取出下一个文件我们使用了一个小技巧来在工作结束后终止线程为了发出完成信号枚举线程把一个虚拟对象放入队列(这类似于在行李输送带上放一个写着最后一个包的虚拟包)当搜索线程取到这个虚拟对象时就将其放回并终止
注意这里不需要人任何显示的线程同步在这个程序中我们使用队列数据结构作为一种同步机制