多线程实现代码统计

使用多线程实现代码行数统计。
最近找工作碰到的一道面试题,回来没事就实现了下,作个记录。

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;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值