`
yellow0323
  • 浏览: 1655 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

多线程实现代码统计

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

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;
	}
}
分享到:
评论

相关推荐

    多线程实现文件中字母数字及其他字符的分配

    多线程实现文件中字母数字及其他字符的分配 有三个线程 1显示 2 从文件中读取字符 3 分配字符,1过于简单只写了个框架。其余均可实现,其中代码优化不好,忘有改善的告知如何处理

    多线程代码

    一个多线程的cpp代码统计工具,在win10+vs2010上实现,可以在cmd窗口中输入类似“Codestatistics.exe c:”的命令运行,运行结果显示在控制上。工程分两个主要模块,多线程递归所以当前目录下的所有cpp文件,之后进行...

    C# 通过委托和线程实现chart控件的实时更新

    该文档给出了c#线程实时更新图表及其他控件数据的完成代码,通过委托delegate和控件的BeginInvoke方法实现数据的绑定

    java代码统计器【看看你有多少代码量】12月17日修改

    写的一个代码统计器,尝试了两种方法,一种多线程并行处理,一种直接迭代,经过对比,发现迭代效率要高得多,经过分析,使用多线程时因为其实每个线程运行的时间不长,因而新建线程带来的系统开销导致多线程情况下...

    林敏锐-词频统计.zip

    java 实现多线程读取文件,实现词频统计,得出出现频率的前几名。 如果没有积分,需要代码的可以私聊我,发给你链接

    手把手教你实现-基于OpenCV的车流量统计和车速检测代码

    实现了一个简单的车辆速度估计和车流量统计的GUI应用,它使用了Haar级联检测器和相关跟踪器来检测和跟踪视频中的车辆,并通过图像处理和数学计算来估计车辆的速度。 包含功能函数如下: 1.导入必要的库和模块,包括...

    Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用

    Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用   目录 Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用 一、简单介绍 二、能学到 三、实现思路 四、效果...

    DMS 统计日志信息(后台执行的 支持多线程)

    自己写的 后台执行的 支持多线程 学习交流用的 主要用途是提取服务器日志文件中有价值的信息,找到用户进入服务器的时间和退出服务器的时间,将这个用户对象写入文件(暂时没有实现写入数据库,只是打印到指定的...

    C++程序设计~统计商品销售数据

    统计商品销售数据,要求能用菜单实现如下功能:(1)输入每件商品的名称,编号,入库日期,标价,成本。(2)输入每件商品的售价,出售日期。(3)按总销售量从高到低排除每种商品的名称,售出件数,销售额。(4)...

    亲测可用基于Linux消息队列的简易聊天室(C语言).zip

    Linux IPC通信利用消息队列消息机制,多线程通信,字符串处理,链表操作,信号简单处理。消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来...

    基于Python实现的股票量化系统源码,基于PyQT的界面,实现选股、策略回测、实盘微信提醒及交互等多项功能.zip

    多线程事件引擎 四大功能 股票数据 选股 策略回测 实盘交易 历史数据均免费来自于网络 Wind免费个人接口 TuShare 实盘微信提醒及交互 一键挂机 全自动交易 模拟交易,支持9个模拟账号 实盘和回测共用同一策略代码 实...

    python爬虫大作业报告+代码

    (1)实现时需要至少使用图形界面、多线程、文件操作、数据库编程、网页爬虫、统计 分析并绘图(或数据挖掘)六项技术,缺一不可。少一项则直接影响是否及格。 (2)系统要具有一定复杂度。应用系统的业务流程不能...

    C语言开发的单链表实现的线程安全型数据结构.zip

    (2)其次创建两个线程分别对链表多次进行插入节点操作和多次删除插入操作,通过简单的互斥机制实现两个线程同时启用,相互不会发生冲突,实现互斥模型,主要验证方式是打印要插入节点数,删除节点数,删除失败节点...

    C++ Qt 创建多线程,控制6组ABB输出到UI界面上,使用moveToThread方式,配合互斥锁条件变量代码示例

    共6组数,有6个A,12个B,所以一开始可以很直白的创建2个槽函数,来分别输出A或者B就可以初步效果了,加上互斥锁和条件变量的配合,使用一个字符计数器来全局统计一下,将计数器对3取余,判断余数就可以轻松实现效果...

    C++实现的FTP服务器

    使用多线程技术,允许多个客户端同时连接。实时记录显示服务器和客户端交互的状态变化。支持添加用户,对用户进行管理。可以统计在线用户名和对应的IP地址以及登陆时间。可以统计对传输字节数,当前连接数,文件下载...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    源码统计器v1.1

    这当然是任何一款源代码统计工具所必需具备的功能。为此,我自建了一个测试用的cpp文件(test.cpp),在其中我设计了多个遵循c++的注释方式,但又很容易导致统计错误的&quot;;;;;;;;陷阱&quot;;;;;;;;。虽然有些注释...

    C++注释分析工具源码

    用多线程实现统计C++中代码注释、空行和有效代码行数的工具,利用了状态矩阵做的词法分析,改造后可以技术其它语音的统计。

    源码统计器1.1版(源码+软件)

    这当然是任何一款源代码统计工具所必需具备的功能。为此,我自建了一个测试用的cpp文件(test.cpp),在其中我设计了多个遵循c++的注释方式,但又很容易导致统计错误的"陷阱"。虽然有些注释语句看起来有点奇怪,但的确...

    《Delphi7编程100例》代码

    《Delphi7编程100例》代码目录:---------------------------------------------ToolBar工具栏控件的使用动态建立主菜单选项窗口界面的动态分隔条动态设置选项卡页面在标题栏中自定义按钮窗体开合窗帘效果Windows XP...

Global site tag (gtag.js) - Google Analytics