您的位置:首页 > 编程语言 > Java开发

《java核心技术》第八版14.6节使用阻塞队列的代码(生产者—消费者,根据关键字搜索文件内容)

2012-12-11 21:07 344 查看
package thread;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestBlockingQueue {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("输入初始目录:");
String dir = in.nextLine();
System.out.print("输入要查找的关键字:");
String keyword = in.nextLine();

final int QUEUE_SIZE = 100;
final int THREAD_SIZE = 200;

BlockingQueue<File> queue = new ArrayBlockingQueue<File>(QUEUE_SIZE);
Thread enumeration = new Thread(new FileEnumerationTask(queue, new File(dir)));
enumeration.start();
List<Thread> threadList = new ArrayList<Thread>(THREAD_SIZE);
for (int n=0; n<THREAD_SIZE; ++n) {
Thread thread = new Thread(new SearchTask(queue, keyword));
thread.start();
threadList.add(thread);
}
}
}

class FileEnumerationTask implements Runnable {
private BlockingQueue<File> queue;
private File startingDir;
public static final File DUMMY = new File("");

// 构造器
public FileEnumerationTask(BlockingQueue<File> queue, File startingDir) {
this.queue = queue;
this.startingDir = startingDir;
}

// 执行枚举的逻辑
private void enumerate(File dir) throws InterruptedException {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
enumerate(file);
} else {
queue.put(file); // 如果队列满,就阻塞。在阻塞时,如果本线程被中断(interrupt),就会抛出“中断异常”。
}
}
}

@Override
public void run() {
try {
enumerate(this.startingDir);
queue.put(DUMMY);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

class SearchTask implements Runnable {
private BlockingQueue<File> queue;
private String keyword;

// 构造器
public SearchTask(BlockingQueue<File> queue, String keyword) {
this.queue = queue;
this.keyword = keyword;
}

private void search(File file) throws IOException {
Scanner in = new Scanner(new FileInputStream(file));
int lineNumber = 0;
while (in.hasNextLine()) {
++lineNumber;
String line = in.nextLine();
if (line.contains(keyword)) {
System.out.printf("%s:%d:%s%n", file.getPath(), lineNumber,
line);
}
}
}

@Override
public void run() {
boolean done = false;
try {
while (!done) {
File file = queue.take();
if (file == FileEnumerationTask.DUMMY) {
queue.put(file);
done = true;
} else {
search(file);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐