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();
}
}
}
《java核心技术》第八版14.6节使用阻塞队列的代码(生产者—消费者,根据关键字搜索文件内容)
最新推荐文章于 2021-07-21 11:20:08 发布