`
yellow0323
  • 浏览: 1709 次
  • 性别: 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. **多线程**:多线程是指在单个程序中同时执行多个...

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

    在给定的“多线程实现文件中字母数字及其他字符的分配”项目中,我们看到一个旨在利用多线程来读取文件、分析字符并进行某种形式的分配的任务。下面我们将深入探讨这个主题,包括多线程的基本概念、Linux环境下的...

    java多线程代码行数计数器

    总的来说,这个“java多线程代码行数计数器”利用Java的多线程特性,提高了代码统计的效率,尤其适用于处理大量源代码的情况。尽管存在一些小瑕疵,但其核心功能强大且实用。对于开发者而言,这无疑是一个有助于项目...

    多线程代码

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

    Android多线程实现简单字符串计数器

    本示例“Android多线程实现简单字符串计数器”旨在教你如何在Android环境中利用多线程来实现一个简单的字符串计数器功能。 首先,我们需要理解Android中的线程模型。主线程,也称为UI线程,负责处理用户界面的更新...

    在Delphi中利用多线程实现数据采集的方法.doc

    ### 在Delphi中利用多线程实现数据采集的方法 #### 概述 本文档主要介绍了如何在Delphi环境中使用多线程技术实现数据采集的基本原理与实现步骤。Delphi是一种功能强大的开发工具,广泛应用于Windows应用程序开发。...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。本文将深入探讨Java多线程中...通过阅读和分析提供的`java多线程的案例源代码`,可以更直观地了解这些概念在实际中的应用。

    多线程并行执行,汇总结果

    这些代码可能展示了如何使用`Thread`和`CountDownLatch`来实现多线程并行执行,并在所有线程完成后汇总结果。具体代码实现可能包括创建`Thread`对象、初始化`CountDownLatch`、线程的`run()`方法以及主线程的等待和...

    多线程HTTP服务器源代码

    标题中的“多线程HTTP服务器源代码”是指一个实现了HTTP协议服务端的程序,它采用了多线程技术来处理来自多个客户端的并发请求。在计算机网络中,HTTP(超文本传输协议)是用于从万维网服务器传输超媒体文档到本地...

    一个C++实现的源代码行数统计工具

    这个“C++实现的源代码行数统计工具”就是为此目的设计的。下面我们将深入探讨这个工具以及与之相关的C++编程、Visual C++开发环境和源代码管理等知识点。 首先,C++是一种静态类型的、编译式的、通用的、大小写...

    [代码]在线统计+多线程模拟+单例

    综合以上内容,这个压缩包可能包含了一段Java代码,该代码实现了一个在线统计系统,通过多线程模拟用户登录并进行分组缓存。其中可能使用了单例模式来管理统计服务,同时在多线程环境下保证了数据一致性。具体实现...

    java多线程分页查询

    通过对上述代码的分析可以看出,该方案充分利用了Java多线程技术的优势,通过预加载前一页的数据,大大提高了后续请求的响应速度。然而,在实际应用中还需要注意以下几点: - **线程池管理**:频繁地创建新线程可能...

    Springboot Druid多数据源 多线程

    总结起来,这个项目展示了如何利用Spring Boot和Druid实现多数据源切换,以及如何在Spring Boot中配置和使用多线程来提升数据库操作的并发性能。对于初学者,这是一个很好的学习资源,可以深入理解Spring Boot的自动...

    C#处理大容量数据,及多线程简单应用

    另外,`Task`和`async/await`关键字是.NET Framework 4.0引入的,它们为多线程编程提供了更现代、更简洁的方法,使得代码更易于理解和维护。 对于大容量数据的处理,优化SQL查询至关重要。SQL是用于与数据库交互的...

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

    C# 通过委托和线程实现 Chart 控件的实时更新 在 C# 编程中,实现 Chart 控件的实时更新是一个常见的需求。为此,我们可以使用委托(Delegate)和线程(Thread)来实现这个功能。在本文中,我们将详细介绍如何使用...

    代码行统计工具,可以显示统计代码进度条

    【源代码统计工具】的文件名表明,这个压缩包包含了工具的源代码。对于开发者而言,这是一份宝贵的资源,他们可以查看和学习如何使用MFC构建这样的工具,或者根据需要自定义和扩展其功能。通过分析源代码,开发者...

    自己写的代码统计工具源代码VB2005

    8. **多线程**:如果代码统计过程可能耗时较长,可以考虑使用多线程来提高用户体验。VB2005支持多线程编程,允许在后台执行统计任务,而不会阻塞主线程,从而保持界面的响应性。 9. **结果展示**:最后,统计结果应...

    linux 文件字数统计的多线程程序

    本课题旨在设计一个Linux环境下,使用多线程技术统计两个文件字数的程序。程序的核心功能是创建两个子线程,每个线程负责一个文件的字数统计,统计完成后,线程将结果写入共享内存区域,由父线程读取并打印出来。...

Global site tag (gtag.js) - Google Analytics