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