多线程实现代码统计

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

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;
	}
}

你可能感兴趣的:(java,多线程,工作,面试,F#)