package Chapter14Thread.future;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
public class FutureTest {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("ÇëÊäÈëÎļþÃû");
String dictionary=in.nextLine();
System.out.println("ÊäÈëÒª²éÕҵĹؼü×Ö£º");
String keyword=in.nextLine();
MathCounter counter=new MathCounter(new File(dictionary), keyword);
FutureTask task=new FutureTask(counter);
Thread t=new Thread(task);
t.start();
try {
System.out.println(task.get()+"matching files");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class MathCounter implements Callable{
private File dictionary;
private String keyword;
private int count;
public MathCounter(File dic,String keyword){
this.dictionary=dic;
this.keyword=keyword;
}
public Integer call() throws Exception {
// TODO Auto-generated method stub
count=0;
try{
System.out.println("Ö´ÐÐ");
File[] files=dictionary.listFiles();
///////
List> results=new ArrayList();
for(File file:files){
//Èç¹ûÊÇĿ¼µÄ»°£¬µÝ¹é
if(file.isDirectory()){
MathCounter counter=new MathCounter(file, keyword);
//ÓÃFutureTask°ü×°Æ÷°ÑCallableת»»³ÉFuture
FutureTask task=new FutureTask(counter);
results.add(task);
//ÓÃFutureTask°ü×°Æ÷°ÑCallableת»»³ÉRunnable
Thread t=new Thread(task);
t.start();
}else{
if(search(file)){
count++;
}
}
for(Future result:results){
try{
count+=result.get();
System.out.println("futureÀïÃæ½á¹û::"+result.get());
}catch(ExecutionException e){
e.printStackTrace();
}
}
}
}catch(InterruptedException e){
System.out.println("²úÉúÖжÏÒì³£");
}
return count;
}
//Èç¹û°üº¬¹Ø¼ü×Ö£¬·µ»Øtrue
public boolean search(File file){
try{
try(Scanner in=new Scanner(file)){
boolean found=false;
while(in.hasNextLine()&&!found){
String line=in.nextLine();
if(line.contains(keyword)){
found=true;
}
}
return found;
}
}catch (IOException e) {
// TODO Auto-generated catch block
return false;
}
}
}