如要求:
一个文本格式的大文件,每行数据为一个字符
首先,需要对大文件进行分解成多个块,然后每一个块交给一个线程去处理。
其次,需要多线程协作控制器,等待所有线程处理完成后再对结果进行汇总。
本人曾对多线程解析大文件的思路写过一篇文章,有兴趣的话可以订阅看看。Java 多线程解析大文件
int sum = Files.lines(Paths.get("D:\\data.txt"), StandardCharsets.UTF_8).parallel().mapToInt(Integer::parseInt).sum();
使用jdk1.8新增的Spliterator,可分割迭代器。
AtomicInteger count = new AtomicInteger(0);
List<String> strList = new ArrayList();
Spliterator spliterator = strList.spliterator();
/**
* 多线程计算list中数值的和
* 测试spliterator遍历
*/
@Test
public void mytest(){
for(int i=0;i<4;i++){
new MyThread().start();
}
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("结果为:" + count);
}
class MyThread extends Thread{
@Override
public void run() {
String threadName = Thread.currentThread().getName();
System.out.println("线程"+threadName+"开始运行-----");
spliterator.trySplit().forEachRemaining(new Consumer() {
@Override
public void accept(Object o) {
if(isInteger((String)o)){
int num = Integer.parseInt(o +"");
count.addAndGet(num);
System.out.println("数值:"+num+"------"+threadName);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
System.out.println("线程"+threadName+"运行结束-----");
}
}
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}