多线程实现代码统计
使用多线程实现代码行数统计。
最近找工作碰到的一道面试题,回来没事就实现了下,作个记录。
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;}}