一个大文件10G,里面一行行的数字(Integer, 空格分隔),要找其中出最大的10个数字的值
相同的数字算作一个,比如最大的数字是 20、10、13、20、3,则最大的3个数字是 20、13、10
设计思想:
1.读取文件流获取到总的行数,对总行数进行分片,比如有1000行数据,分为10片的话,第一片数据为1-100,第二片的数据为101-200,以此类推等
2.使用多线程处理已经分片好的数据,每个获取获取当前处理分片数据的最大的10个数字,把其存放到list集合中
3.对list集合的数据再进行组合倒序排序,获取前10个数字
import org.apache.commons.lang.StringUtils;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeSet;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
/**
* 一个大文件10G,里面一行行的数字(Integer, 空格分隔),要找其中出最大的10个数字的值
* 相同的数字算作一个,
* 比如最大的数字是 20、10、13、20、3,则最大的3个数字是 20、13、10
*/
public class BigFileSortUtil {
// 存储每个线程获取到的最大10个数字的数组
private static CopyOnWriteArrayList<TreeSet<Integer>> treeSetList = new CopyOnWriteArrayList<>();
private static ThreadPoolExecutor executor =
ne