今天在看某大佬的博客时,看到了一个多线程的实例。就是计算一个hexo博客的总字数。它的思路就是扫描hexo博客文章目录下的全部文件,然后利用多线程读取所有文件内容并处理文本(去掉特殊字符)然后计算总字数。
我把它的项目代码练了一遍,然后就想自己再玩一下。
我这里计算的是一个java项目中java代码的行数(总行数,代码行数,空行数,注释行数)
这里计算用的是AtomicLong,这是个线程安全的原子变量,内部采用CAS算法保证了操作的原子性。
所以这里用AtomicLong定义了4个用于计算的变量。这里用了静态变量,直接在线程中调用它的自增函数。
(开始没有使用静态变量,而是封装成了方法,发现在线程中无法调用(调用无效))
package countword.service;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author www.xyjz123.xyz
* @description
* @date 2019/4/29 20:31
*/
@Component
public class TotalLines {
/**
* 使用AtomicLong用于多线程计数,保证线程安全(计数操作的原子性)。
*/
public static AtomicLong lineSpace = new AtomicLong(0);
public static AtomicLong lineComment= new AtomicLong(0);
public static AtomicLong lineCode = new AtomicLong(0);
public static AtomicLong lineTotal = new AtomicLong(0);
public Long totalSpace(){
return lineSpace.get();
}
public Long totalComment(){
return lineComment.get();
}
public Long totalCode(){
return lineCode.get();
}
public Long total(){
return lineTotal.get();
}
}
下面就是线程类:注释很多,这里就不做解释了。
package countword.thread;
import countword.service.TotalLines;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
* @author www.xyjz123.xyz
* @description
* @date 2019/4/29 20:28
*/
public class ScanJavaThread implements Runnable{