使用多线程实现代码行数统计。
最近找工作碰到的一道面试题,回来没事就实现了下,作个记录。
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的多线程特性,提高了代码统计的效率,尤其适用于处理大量源代码的情况。尽管存在一些小瑕疵,但其核心功能强大且实用。对于开发者而言,这无疑是一个有助于项目...
一个多线程的cpp代码统计工具,在win10+vs2010上实现,可以在cmd窗口中输入类似“Codestatistics.exe c:”的命令运行,运行结果显示在控制上。工程分两个主要模块,多线程递归所以当前目录下的所有cpp文件,之后进行...
本示例“Android多线程实现简单字符串计数器”旨在教你如何在Android环境中利用多线程来实现一个简单的字符串计数器功能。 首先,我们需要理解Android中的线程模型。主线程,也称为UI线程,负责处理用户界面的更新...
### 在Delphi中利用多线程实现数据采集的方法 #### 概述 本文档主要介绍了如何在Delphi环境中使用多线程技术实现数据采集的基本原理与实现步骤。Delphi是一种功能强大的开发工具,广泛应用于Windows应用程序开发。...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。本文将深入探讨Java多线程中...通过阅读和分析提供的`java多线程的案例源代码`,可以更直观地了解这些概念在实际中的应用。
这些代码可能展示了如何使用`Thread`和`CountDownLatch`来实现多线程并行执行,并在所有线程完成后汇总结果。具体代码实现可能包括创建`Thread`对象、初始化`CountDownLatch`、线程的`run()`方法以及主线程的等待和...
标题中的“多线程HTTP服务器源代码”是指一个实现了HTTP协议服务端的程序,它采用了多线程技术来处理来自多个客户端的并发请求。在计算机网络中,HTTP(超文本传输协议)是用于从万维网服务器传输超媒体文档到本地...
这个“C++实现的源代码行数统计工具”就是为此目的设计的。下面我们将深入探讨这个工具以及与之相关的C++编程、Visual C++开发环境和源代码管理等知识点。 首先,C++是一种静态类型的、编译式的、通用的、大小写...
综合以上内容,这个压缩包可能包含了一段Java代码,该代码实现了一个在线统计系统,通过多线程模拟用户登录并进行分组缓存。其中可能使用了单例模式来管理统计服务,同时在多线程环境下保证了数据一致性。具体实现...
通过对上述代码的分析可以看出,该方案充分利用了Java多线程技术的优势,通过预加载前一页的数据,大大提高了后续请求的响应速度。然而,在实际应用中还需要注意以下几点: - **线程池管理**:频繁地创建新线程可能...
总结起来,这个项目展示了如何利用Spring Boot和Druid实现多数据源切换,以及如何在Spring Boot中配置和使用多线程来提升数据库操作的并发性能。对于初学者,这是一个很好的学习资源,可以深入理解Spring Boot的自动...
另外,`Task`和`async/await`关键字是.NET Framework 4.0引入的,它们为多线程编程提供了更现代、更简洁的方法,使得代码更易于理解和维护。 对于大容量数据的处理,优化SQL查询至关重要。SQL是用于与数据库交互的...
C# 通过委托和线程实现 Chart 控件的实时更新 在 C# 编程中,实现 Chart 控件的实时更新是一个常见的需求。为此,我们可以使用委托(Delegate)和线程(Thread)来实现这个功能。在本文中,我们将详细介绍如何使用...
【源代码统计工具】的文件名表明,这个压缩包包含了工具的源代码。对于开发者而言,这是一份宝贵的资源,他们可以查看和学习如何使用MFC构建这样的工具,或者根据需要自定义和扩展其功能。通过分析源代码,开发者...
8. **多线程**:如果代码统计过程可能耗时较长,可以考虑使用多线程来提高用户体验。VB2005支持多线程编程,允许在后台执行统计任务,而不会阻塞主线程,从而保持界面的响应性。 9. **结果展示**:最后,统计结果应...
本课题旨在设计一个Linux环境下,使用多线程技术统计两个文件字数的程序。程序的核心功能是创建两个子线程,每个线程负责一个文件的字数统计,统计完成后,线程将结果写入共享内存区域,由父线程读取并打印出来。...