線程池

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

 

package com.htf.utils;

import com.alibaba.fastjson.JSONArray;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.*;

/**
 * @Auther: admin
 * @Date: 2019/8/8 21:48
 * @Description:
 */
public class Multithreading {

    public static void test() {
      /*  List dataList = parseExcel(new File(filePath), EventDataInfo.PARSER_START_ROW_NUM, 1, -1, -1)
        int size = dataList.size();
        // 啓動線程數,默認爲10
        int nThreads = EventDataInfo.DEFAULT_THREADS_NUM;
        if (size < 10) {
            nThreads = size;
        }
        String checkResult = "";
        if (size > 100) {
            checkResult = analyseExcel(dataArray, nThreads, baseParam);
        } else {
            checkResult = syncAnalyseExcel(dataArray, nThreads, baseParam);
        }*/
    }


    protected String analyseExcel(final JSONArray dataArray, final int nThreads, final HashMap param) throws InterruptedException, ExecutionException {
        new Thread() {
            @Override
            public void run() {
                try {
                    StringBuffer ret = new StringBuffer();
                    int size = dataArray.size();
                    int num = nThreads;
                    if (size % nThreads != 0) {
                        num = nThreads + 1;
                    }
                    // 多線程池
                    ExecutorService executorService = Executors.newFixedThreadPool(num);
                    // 設置基本參數
                    final HashMap paramMap = param;
                    List<Future> futures = new ArrayList(num);

                    for (int i = 0; i < nThreads; i++) {
                        // 根據文件大小和線程數獲取子列表
                        final List subList = dataArray.subList(size / nThreads * i, size / nThreads * (i + 1));
                        Callable task = new Callable() {
                            @Override
                            public String call() throws Exception {
                                StringBuffer sb = new StringBuffer();
                                for (Object obj : subList) {
                                    // 執行解析操作,返回驗證結果
                                    //logger.info("======current Thread:{}", Thread.currentThread().getName());
                                    //sb.append(executeAnalyse(JSONObject.parseObject(obj.toString()), paramMap));
                                }
                                return sb.toString();
                            }
                        };
                        futures.add(executorService.submit(task));
                    }

                    if (size % nThreads != 0) {
                        final List subList2 = dataArray.subList(size - (size % nThreads), size);

                        futures.add(executorService.submit(new Callable() {
                            @Override
                            public String call() throws Exception {
                                StringBuffer sb = new StringBuffer();
                                for (Object obj : subList2) {
                                    // 執行解析操作,返回驗證結果
                                    // logger.info("======current Thread:{}", Thread.currentThread().getName());
                                    //sb.append(executeAnalyse(JSONObject.parseObject(obj.toString()), paramMap));
                                }
                                return sb.toString();
                            }
                        }));
                    }
                    // 獲取校驗錯誤結果
                    for (Future future : futures) {
                        ret.append(future.get());
                        // logger.info("future result:" + future.get());
                    }
                    // 關閉多線程
                    executorService.shutdown();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
        return "";
    }


    protected String syncAnalyseExcel(JSONArray dataArray, int nThreads, HashMap param)
            throws InterruptedException, ExecutionException {
        StringBuffer ret = new StringBuffer();
        int size = dataArray.size();
        int num = nThreads;
        if (size % nThreads != 0) {
            num = nThreads + 1;
        }
        // 多線程池
        ExecutorService executorService = Executors.newFixedThreadPool(num);
        // 設置基本參數
        final HashMap paramMap = param;
        List<Future> futures = new ArrayList(num);
        for (int i = 0; i < nThreads; i++) {
            // 根據文件大小和線程數獲取子列表
            final List subList = dataArray.subList(size / nThreads * i, size / nThreads * (i + 1));
            Callable task = new Callable() {
                @Override
                public String call() throws Exception {
                    StringBuffer sb = new StringBuffer();
                    for (Object obj : subList) {
                        // 執行解析操作,返回驗證結果
                        //logger.info("======current Thread:{}", Thread.currentThread().getName());
                        // sb.append(executeAnalyse(JSONObject.parseObject(obj.toString()), paramMap));
                    }
                    return sb.toString();
                }
            };
            futures.add(executorService.submit(task));
        }
        if (size % nThreads != 0) {
            final List subList2 = dataArray.subList(size - (size % nThreads), size);

            futures.add(executorService.submit(new Callable() {
                @Override
                public String call() throws Exception {
                    StringBuffer sb = new StringBuffer();
                    for (Object obj : subList2) {
                        // 執行解析操作,返回驗證結果
                        // logger.info("======current Thread:{}", Thread.currentThread().getName());
                        // sb.append(executeAnalyse(JSONObject.parseObject(obj.toString()), paramMap));
                    }
                    return sb.toString();
                }
            }));
        }
        // 獲取校驗錯誤結果
        for (Future future : futures) {
            ret.append(future.get());
            // logger.info("future result:" + future.get());
        }
        // 關閉多線程
        executorService.shutdown();
        return ret.toString();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章