import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.stream.Stream; //4050005120 1g //1840653127 10g public class Test { public static void main(String[] args) { HashMap<String, List<Integer>> findIntegers = new HashMap<>(); int threadAmount = 10; CountDownLatch countDownLatch = new CountDownLatch(threadAmount); try { String fileDire = "E:\\1g.txt"; // String fileDire = "C:\\Users\\root\\Desktop\\aaa.txt"; Stream<String> lines = Files.lines(Paths.get(fileDire)); long lineCount = lines.count(); Test test = new Test(); long subFilePartSize = test.getResultPartSize(lineCount, threadAmount); //threadAmount + 1 多增加一个线程 计算剩余的 不足 subFilePartSize 的行 if(lineCount > threadAmount* subFilePartSize){ threadAmount++; } for (int i = 0; i < threadAmount; i++) { Stream<String> finalLines = Files.lines(Paths.get(fileDire)); int filePart = i; new Thread(() -> { System.out.println(Thread.currentThread().getName() + " " + "start running"); Stream<String> limit = finalLines.skip(subFilePartSize * filePart).limit(subFilePartSize); List<Integer> maxTopTenInteger = test.getMaxTopTenInteger(limit); findIntegers.put(Thread.currentThread().getName(), maxTopTenInteger); countDownLatch.countDown(); System.out.println(Thread.currentThread().getName()+ " " + "end running"); }, "Thread " + i).start(); } } catch (IOException e) { e.printStackTrace(); } try { countDownLatch.await(); System.out.println(findIntegers); } catch (InterruptedException e) { e.printStackTrace(); } } private long getResultPartSize(long fileSize, int threadAmount) { return fileSize / threadAmount; } private List<Integer> getMaxTopTenInteger(Stream<String> limit) { List<Integer> integers = new ArrayList<>(); limit.forEach(s -> { Integer except = Integer.valueOf(s); if (integers.size() > 9) { compareAndSwap(integers, except); } else { integers.add(except); } }); return integers; } private void compareAndSwap(List<Integer> integers, Integer except) { for (int i = 0; i < integers.size(); i++) { Integer integer = integers.get(i); if (except > integer) { integers.set(i, except); } } } }
HashMap<String, List<Integer>> findIntegers = new HashMap<>();
就是每个线程中取出的最大的前10 List<Integer>,
最后一步是 比较合并 findIntegers ,n 个list,merge成一个。