package com.test.current;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
public class FutureTest {
public static void main(String[] args) {
//指定目录和关键字
String directory = "C:\\Program Files\\Java\\jdk1.6.0_29";
String keyword = "volatile";
MatchCounter counter = new MatchCounter(new File(directory),keyword);
FutureTask<Integer> task = new FutureTask<Integer>(counter);
Thread t = new Thread(task);
t.start();
try{
System.out.println(task.get() + "matching files");
}catch (Exception e) {
e.printStackTrace();
}
}
}
//这个线程用户向队列中添加文件
class MatchCounter implements Callable<Integer>{
private File directory;
private String keyword;
private int count;
public static File DUMMY = new File("");//这个文件作为一个结束标记
public MatchCounter(File directory,String keyword){
this.directory = directory;
this.keyword = keyword;
}
public Integer call(){
count = 0;
try {
File[] files = directory.listFiles();
ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>();
for (File file : files) {
if(file.isDirectory()){
MatchCounter counter = new MatchCounter(file, keyword);
FutureTask<Integer> task = new FutureTask<Integer>(counter);
results.add(task);
Thread t = new Thread(task);
t.start();
}else{
if(search(file)){
count++;
}
}
}
for(Future<Integer> result:results){
try{
count += result.get();
}catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return count;
}
public boolean search(File file){
try{
Scanner in = new Scanner(new FileInputStream(file));
boolean found = false;
while(!found && in.hasNextLine()){
String line = in.nextLine();
if(line.contains(keyword)){
found = true;
}
}
in.close();
return found;
}catch (IOException e) {
return false;
}
}
}