题目:统计文本中的各个单词出现次数,并将汇总数据保存到txt文件中。
因为是多个线程对一个文本进行检索,所以我们应当使用调用Runnable接口的线程;首先我们来新建一个类,来实现单个线程对文本中的指定部分的检索。
import java.util.HashMap;
import java.util.Map;
public class WordCount implements Runnable{
//初始化线程要检索的内容
String content = " ";
//用Map来记录文本中出现的单词和单词出现的次数
Map<String,Integer> map = new HashMap<>();
//构造函数,方便调用线程,参数为要检索的字符串
public WordCount (String content){
this.content= content;
}
@Override
public void run() {
//将要检索的字符串,去掉头尾空格后,按空格分开分组
String[] splitStr = content.trim().split("\\s");
//遍历 splitStr 数组,得到存储的各个单词
for (int i = 0; i < splitStr.length; i++) {
//如果Map中存有检索到的单词,将对应的value值即出现的次数加一
if (map.containsKey(splitStr[i])){
Integer value= map.get(splitStr[i])+1;
map.put(splitStr[i],value);
}else {
//如果没有,则在Map中添加该单词
map.put(splitStr[i],1);
}
}
}
}
接下来,我们就要设计主线程来读取文本中的内容,并遍历分组给不同的线程进行执行。因为涉及多个子线程运行,所以我们应当将这些子线程托管给线程池。下面,我们就进行读取文件和遍历文本的代码。
import java.io.*;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class WordCountTeacher {
// 设置一个Map集合,key为线程名;value为线程所存储的map合集信息(单词及其出现次数)
static Map<String, Map<String, Integer>> threadMap = new TreeMap<>();
public static void main(String[] args) {
//记录开始时间
long start = System.currentTimeMillis();
//字符流读取文本并输出统计结果
FileReader fr;
BufferedReader bf;
FileOutputStream fos = null;
OutputStreamWriter osw = null;
StringBuffer txtContent;
//记录正在读取的行数
int lineNum = 0;
//线程池
ExecutorService executorService = Executors.newCachedThreadPool();
try {
//注意,地址为读取文件的路径
fr = new FileRead