使用多线程实现代码行数统计。
最近找工作碰到的一道面试题,回来没事就实现了下,作个记录。
最近找工作碰到的一道面试题,回来没事就实现了下,作个记录。
package com.toyapps.linecount;
/**
* 记录
* @author Administrator
*/
public class Counter {
private int blankLines ; //注释行数
private int commentLines ; //空格行数
private int codeLines ; //代码行数
public int getBlankLines() {
return blankLines;
}
public int getCommentLines() {
return commentLines;
}
public int getCodeLines() {
return codeLines;
}
public void setBlankLines(int blankLines) {
this.blankLines = blankLines;
}
public void setCommentLines(int commentLines) {
this.commentLines = commentLines;
}
public void setCodeLines(int codeLines) {
this.codeLines = codeLines;
}
}
package com.toyapps.linecount;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.concurrent.Callable;
/**
* 统计一个文件的行数
* @author Administrator
*/
public class LineCount implements Callable<Counter> {
private File file ;
private Counter counter ;
int codeLines = 0 ; //代码行数
int blankLines = 0 ; //空格行数
int commentLines = 0 ; //注释行数
LineCount(File file){
this.file = file ;
}
public void countLine(){
try {
BufferedReader bf = new BufferedReader(new FileReader(file));
String line=null ;
while((line=bf.readLine())!=null){
if("".equals(line.trim())){
blankLines ++ ;
} else if(line.trim().startsWith("/*")
||line.trim().startsWith("*")
||line.trim().startsWith("//")){
commentLines ++ ;
} else {
codeLines ++ ;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("file not found...");
} catch (IOException e) {
e.printStackTrace();
System.out.println("io 错误...");
}
}
public Counter call() throws Exception {
counter = new Counter();
countLine();
counter.setBlankLines(blankLines);
counter.setCodeLines(codeLines);
counter.setCommentLines(commentLines);
return counter;
}
package com.toyapps.linecount;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
*
* @author Administrator
*/
public class TestThread {
//文件对应的计数集
private Map<String,Counter> map= new HashMap<String,Counter>();
private static ExecutorService pool ;
/**
* @param args
*/
public static void main(String[] args) {
File f = new File("E:/workspace/TestCount/src");
TestThread tt = new TestThread();
pool = Executors.newFixedThreadPool(10);
Map<String,Counter> resultMap= new HashMap<String,Counter>();
resultMap = tt.fileCheck(f);
for(Map.Entry<String, Counter> temp : resultMap.entrySet()){
System.out.println(temp.getKey()+":");
System.out.println(" blank lines:" + temp.getValue().getBlankLines());
System.out.println(" comment lines:" + temp.getValue().getCommentLines());
System.out.println(" code lines:" + temp.getValue().getCodeLines());
}
pool.shutdown();
}
public Map<String,Counter> fileCheck(File f) {
if(!f.isDirectory()){
String name = f.getName();
if(name.endsWith(".java")){
Future<Counter> future = pool.submit(new LineCount(f));
try {
if(map.get(name)!=null) name="/"+name;
map.put(name,future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
return map;
}
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
map = fileCheck(files[i]);
}
return map;
}
}