zoukankan      html  css  js  c++  java
  • 多线程按行读取文件【我】

    package file;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**   
     * @Package file 
     * @ClassName FileThread.java
     * @date 2019年4月9日 下午5:14:44 
     * @version V1.0   
    */
    public class FileThread {
        
        public static void main(String[] args) throws Exception {
            long t1 = System.currentTimeMillis();
    
            // String localFilePath = localTempPath+"/"+fileName;
            String localFilePath = "D:\a\c\haha.txt";
    
            // 开启固定线程池
            ExecutorService exec = Executors.newFixedThreadPool(50);
            // 逐行读取本地文件
            List<String> dataList = new ArrayList<>();
    
            // File f = new File("D:\a\b\in.txt");
            File f = new File(localFilePath);
            InputStreamReader reader = new InputStreamReader(new FileInputStream(f), "GBK");
            BufferedReader br = new BufferedReader(reader);
            String str = null;
            // 定义计数器
            int i = 0;
            while ((str = br.readLine()) != null) {
                // i的值是从1开始
                i++;
    //            System.out.println(str);
                // 加入集合
                dataList.add(str);
                if (i % 100 == 0) {
                    System.out.println("i"+i);
                    // 每次传入线程的集合
                    List<String> onceList = new ArrayList<>();
                    for (String item : dataList) {
                        onceList.add(item);
                    }
                    // 清空集合
                    dataList = null;
                    // 重构集合
                    dataList = new ArrayList<String>();
    
                    Map<String, Object> pMap = new HashMap<>();
                    // 开启线程
                    Runnable task = new BatchHandlerThreadTask(onceList, pMap);
                    exec.submit(task);
                }
            }
            reader.close();
            br.close();
    
            // 判断最后一次
            if (dataList.size() != 0) {
                Map<String, Object> pMap = new HashMap<>();
                Runnable task = new BatchHandlerThreadTask(dataList, pMap);
                exec.submit(task);
            }
    
            exec.shutdown();
            while (true) {
                if (exec.isTerminated()) {
                    System.out.println("全部线程都结束了,i: "+i+"耗时:"+(System.currentTimeMillis()-t1));
                    break;
                }
            }
    
        }
    
        
    }
    /*
    * @date 2019年4月4日 上午10:36:03 
    * @Description: 此处添加文件描述……
    */
    package file;
    
    import java.util.List;
    import java.util.Map;
    
    /** 
     * 批量合规的多线程调用任务  
     * @Package com.tydic.jtcrm.batch.task 
     * @ClassName BatchHandlerThreadTask.java
     * @date 2019年4月4日 上午10:36:03 
     * @version V1.0   
    */
    public class BatchHandlerThreadTask implements Runnable {
    //    protected static Logger logger = LoggerFactory.getLogger(BatchHandlerThreadTask.class);
        
        //待处理数据集合
        private List dataList;
        //其他参数Map
        private Map paramMap;
        
        public BatchHandlerThreadTask() {
            super();
        }
    
        public BatchHandlerThreadTask(List dataList, Map paramMap) {
            super();
            this.dataList = dataList;
            this.paramMap = paramMap;
        }
    
        public List getDataList() {
            return dataList;
        }
    
        public void setDataList(List dataList) {
            this.dataList = dataList;
        }
    
        public Map getParamMap() {
            return paramMap;
        }
    
        public void setParamMap(Map paramMap) {
            this.paramMap = paramMap;
        }
    
    
        @Override
        public void run() {
            long t1 = System.currentTimeMillis();
    
            for (int y = 0; y < dataList.size(); y++) {
    
                String s = (String) dataList.get(y);
    //            System.out.println("--t--线程名: " + Thread.currentThread().getName() + "--当前批次处理总数据" + dataList.size() + "--当前数据---" + s);
                try {
                    Thread.sleep(60);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("--h--线程名: " + Thread.currentThread().getName() + "--当前线程耗时:" + (System.currentTimeMillis() - t1) + "--当前批次处理总数据" + dataList.size());
        }
    
    }
  • 相关阅读:
    17 python学习笔记-异常处理
    二、如何使用postman做接口测试笔记(二)
    16 python学习笔记-使用yagmail模块发送邮件
    15 python学习笔记-多进程multiprocessing
    14 python学习笔记-多线程threading
    用HTML5构建一个流程图绘制工具
    百度地图API绘制带头箭头的折线
    使用JsPlumb绘制拓扑图的通用方法
    SQL Server 2008启用sa账户
    eclipse/ggts/myeclipse清除SVN用户名和密码
  • 原文地址:https://www.cnblogs.com/libin6505/p/10695823.html
Copyright © 2011-2022 走看看