package com.test.current;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
public class ThreadPoolTest {
public static void main(String[] args) {
//指定目录和关键字
String directory = "C:\\Program Files\\Java\\jdk1.6.0_29";
String keyword = "volatile";
ExecutorService pool = Executors.newCachedThreadPool();
MatchCounter counter = new MatchCounter(new File(directory), keyword, pool);
Future<Integer> result = pool.submit(counter);
try{
System.out.println(result.get()+" matching files");
}catch (Exception e) {
e.printStackTrace();
}
pool.shutdown();
int largestPoolSize = ((ThreadPoolExecutor)pool).getLargestPoolSize();
System.out.println("largest pool size="+largestPoolSize);
}
}
class MatchCounter implements Callable<Integer>{
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() throws Exception {
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, pool);
Future<Integer> result = pool.submit(counter);
results.add(result);
}else{
if(search(file)){
count ++;
}
}
for (Future<Integer> result : results) {
try{
count += result.get();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}catch (Exception e) {
}
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(Exception e){
e.printStackTrace();
return false;
}
}