因为工作需要,需要对公司的代码规模进行统计,下了些网上的工具,功能虽然都很全面,但是无法把结果生成出来,还有就是很多的信息因为是我本来
就不需要的,这类工具都是非常的慢,而且cpu耗费很高,干脆自己写了个,主要实现方式如下:
1、先遍历代码目录,遍历出所有的需要统计的文件类型的文件,把文件的全路径写入到一个临时文件中
2、读取第一步生成的临时文件,设定一个阀值,如果达到此阀值就启动一个线程开始统计阀值内的所有文件的总规模,每个线程把统计的结果加到总数主线程的所在的
难点:
1、线程的同步,主要是每个线程对主线程的代码规模总数变量的操作,只需对同步addsum方法即可
/**
* 同步方法,实现对总量的加减
* @param sum_in
*/
public synchronized void addsum(Long sum_in)
{
sum = sum_in + sum;
}
2、如何在主线程判断所有子线程都已经成功结束
在主线程中定义一个计数器,启动一个线程计数器加1,线程结束后计数器减1
在一个阀值内,直接启动一个线程,并且线程计数器加1
while(str2 != null)
{
File file_temp = new File(str2);
String str_temp_1 = file_temp.getName().substring(file_temp.getName().lastIndexOf(".") + 1, file_temp.getName().length());
if(matchSuffix(str_temp_1))
{
count++;
file_list_thread.add(file_temp);
if(count >= count_thread)
{
countRun++;
List<File> temp = new ArrayList<File>();
temp.addAll(file_list_thread);
Thread th_temp = new Thread(new ReadFileLines(temp));
th_temp.start();
file_list_thread.clear();
temp.clear();
count = 0;
}
}
str2=br.readLine();
}
if(count>0)
{
countRun++;
List<File> temp = new ArrayList<File>();
temp.addAll(file_list_thread);
Thread th_temp = new Thread(new ReadFileLines(temp));
th_temp.start();
file_list_thread.clear();
temp.clear();
}
--启动一个监控计数器线程,线程,扫描主线程的线程计数器,当计数器为0时,统计总数,并生成报表
Thread tss= new Thread(new EndRunnable());
tss.start();
/**
* 判断所有读取文件行数线程执行完成类,并写入到execl文件中
* @author chm
*
*/
class EndRunnable implements Runnable
{
public void run()
{
while(countRun>0)
{
try {
Thread.sleep(5000);
System.out.println("wait for 5 seconds...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("总行数: "+sum);
System.out.println("每种文件类型的行数为: "+pre_fix_list);
System.out.println("每种类型文件的文件数为: "+ver_list);
try
{
//打开文件
WritableWorkbook book=
Workbook.createWorkbook(new File(ver+".xls"));
//生成名为“第一页”的工作表,参数0表示这是第一页
WritableSheet sheet=book.createSheet(ver,0);
//在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
//以及单元格内容为test
Label label_ver=new Label(0,0,"版本");
Label label_pre=new Label(1,0,"文件类型");
Label label_file=new Label(2,0,"文件数");
Label label_sum = new Label(3,0,"总行数");
sheet.addCell(label_ver);
sheet.addCell(label_pre);
sheet.addCell(label_sum);
sheet.addCell(label_file);
int count = 0;
for(String src:pre_fix_list.keySet())
{
count++;
jxl.write.Number number = new jxl.write.Number(3,count,pre_fix_list.get(src));
sheet.addCell(number);
jxl.write.Number number_file = new jxl.write.Number(2,count,ver_list.get(src));
sheet.addCell(number_file);
Label label=new Label(1,count,src);
sheet.addCell(label);
}
Label label=new Label(0,1,ver);
sheet.addCell(label);
Label label1=new Label(0,count+1,"合计");
sheet.addCell(label1);
jxl.write.Number number_sum = new jxl.write.Number(2,count+1,sum);
sheet.addCell(number_sum);
//将定义好的单元格添加到工作表中
/*
* 生成一个保存数字的单元格
* 必须使用Number的完整包路径,否则有语法歧义
*/
//写入数据并关闭文件
book.write();
book.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}