盒子
盒子
文章目录
  1. 1. 阻塞队列
  2. 2. 双端队列

队列和生产者-消费者模式

1. 阻塞队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* 桌面搜索应用中的生产者任务和消费者任务
*/
public class FileCrawler implements Runnable{

private final BlockingQueue<File> queue;
private final FileFilter fileFilter;
private final File root;
...

@Override
public void run() {
try {
crawl(root);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public void crawl(File root) throws InterruptedException {
File[] files = root.listFiles(fileFilter);
if (files != null) {
for (File file: files) {
if (file.isDirectory()) {
crawl(file);
} else if (!alreadyIndexed(file)){
queue.put(file);
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 索引建立
*/
public class Indexer implements Runnable{

private final BlockingQueue<File> fileQueue;

public Indexer(BlockingQueue<File> fileQueue) {
this.fileQueue = fileQueue;
}

@Override
public void run() {
while (true) {
try {
indexFile(fileQueue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 应用启动
*/
public class Window {

public void startIndexing() {
BlockingQueue<File> fileQueue = new ArrayBlockingQueue<>(8);
FileFilter fileFilter = (pathname) -> { return true;};

String path = "src" + File.separator + "main" + File.separator + "resources" +
File.separator + "concurrent";
File root = new File(path);

new Thread(new FileCrawler(fileQueue, fileFilter, root)).start();

for (int i = 0; i < 3; i++) {
new Thread(new Indexer(fileQueue)).start();
}
}
}

2. 双端队列

JAVA6新增两种容器类型,Deque与BlockingDeque,分别为Queue与BlockingQueue的扩展。 Deque是一种双端队列,实现了队列头和队列尾的高效插入与删除,具体实现包括ArrayDeque和LinkedBlockingDeque.

工作密取 在生产者-消费者设计中,所有的消费者拥有一个工作队列,而在工作密取中,每个消费者拥有一个双端队列,如果消费者完成自己双端队列的工作,则可以从其他消费者双端队列末尾秘密的获取工作。

支持一下
扫一扫,支持沈健
  • 微信扫一扫
  • 支付宝扫一扫