线程文件读并计算数值

如要求:
一个文本格式的大文件,每行数据为一个字符

首先,需要对大文件进行分解成多个块,然后每一个块交给一个线程去处理。
其次,需要多线程协作控制器,等待所有线程处理完成后再对结果进行汇总。
本人曾对多线程解析大文件的思路写过一篇文章,有兴趣的话可以订阅看看。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();
    }