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();
}
}
}