package threadPool; import java.io.*; import java.util.*; import java.util.concurrent.*; public class ThreadPoolTest { public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub Scanner in=new Scanner(System.in); System.out.print("Enter base directory(e.g. /usr/local/jdk5.0/src):"); String directory=in.next(); System.out.print("Enter keyword (e.g. volatile):"); String keyword=in.next(); System.out.println("keyword:"+keyword+"directory:"+directory); ExecutorService pool=Executors.newCachedThreadPool(); MatchCounter counter=new MatchCounter(new File(directory),keyword,pool); Future result=pool.submit(counter); try{ System.out.println(result.get()+"matching files"); }catch(ExecutionException e){ e.printStackTrace(); }catch(InterruptedException e){ } pool.shutdown(); int largestPoolSize=((ThreadPoolExecutor) pool).getLargestPoolSize(); System.out.println("largest pool size="+largestPoolSize); } } class MatchCounter implements Callable{ private File directory; private String keyword; private ExecutorService pool; private int count; public MatchCounter(File directory,String keyword,ExecutorService pool){ this.directory=directory; this.keyword=keyword; this.pool=pool; } public Integer call(){ count=0; try { File[] files=directory.listFiles(); List> results=new ArrayList<>(); for(File file:files) if(file.isDirectory()){ MatchCounter counter=new MatchCounter(file,keyword,pool); Future result=pool.submit(counter); results.add(result); } else{ if(search(file)) count++; } for(Future result:results) try { count+=result.get(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return count; } public boolean search(File file){ try{ try(Scanner in=new Scanner(file)){ boolean found=false; while(!found&&in.hasNext()){ String line=in.nextLine(); if(line.contains(keyword)) found=true; } return found; } }catch(IOException e){ return false; } } }