线程池调用demo

2023-09-25  本文已影响0人  Yluozi

创建线程池

    private final ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 1000,
            TimeUnit.SECONDS, new LinkedBlockingQueue<>(9000),
            new CustomizableThreadFactory("joggle-pool-%d"));

调用线程方法:往外传参

            int i=0;
            if(i*size<=total){
                map0.put("startrow",i*size+"");
                map0.put("endrow",(i+1)*size+"");
                Future<List<Map<String,Object>>> list =(Future<List<Map<String,Object>>>)executor.submit(() -> {
                    List<Map<String,Object>> listEx = new ArrayList<>(size);
                    try {
                        logger.info("异步线程调用开始...");
                        listEx=oltFaultUserTabDao.listOnuTcData(map0);
                    } catch (Exception e) {
                        logger.info("异步线程调用失败", e);
                    }
                    return listEx;

                });
                logger.info("查询 onu_tc_data表 第"+i+"次,获取到的数据:"+ list.get().size()+">>>");
                listAll.addAll(list.get());
                list.get().clear();
                i++;
            }

调用线程方法:不往外传参(参数不能共有,存在资源不同步给最终数据的问题)

            AtomicInteger i = new AtomicInteger(0);
            if(i.intValue()*size<=total){
                executor.submit(() -> {
                    try {
                        map0.put("startrow",i.intValue()*size+"");
                        map0.put("endrow",(i.intValue()+1)*size+"");
                        logger.info("异步线程调用开始...");
                        List<Map<String,Object>> list =oltFaultUserTabDao.listOnuTcData(map0);
                        logger.info("查询 _data表 第"+i+"次,获取到的数据:"+ list.size()+">>>");
                        i.incrementAndGet();
                    } catch (Exception e) {
                        logger.info("异步线程调用失败", e);
                    }
                });
            }
         

接口样例

    public List<Map<String,Object>>myTask(int size,int total,Map<String,String> map0) throws ExecutionException, InterruptedException {
        logger.info("myTask 开始执行....");
        List<Map<String,Object>> listAll =  new ArrayList<>(4000000);
        for(AtomicInteger i = new AtomicInteger(0);i.intValue()*size<=total;i.incrementAndGet()){
            Future<List<Map<String,Object>>> list =(Future<List<Map<String,Object>>>)executor.submit(() -> {
                List<Map<String,Object>> listEx = new ArrayList<>(size);
                try {
                    map0.put("startrow",i.intValue()*size+"");
                    map0.put("endrow",(i.intValue()+1)*size+"");
                    listEx=oltFaultUserTabDao.listOnuTcData(map0);
                    logger.info("异步查询 _data表 第"+i+"次,获取到的数据:"+ listEx.size()+">>>");
                } catch (Exception e) {
                    logger.info("异步线程调用失败", e);
                }
                return listEx;
            });
            listAll.addAll(list.get());
        }
        logger.info("myTask执行结束,共计查询数据:"+listAll.size()+"条...");
        return  listAll;
    }

我理解的,线程销毁后,线程内部创建的对象也会跟着销毁,不会占用太多gc资源。

上一篇 下一篇

猜你喜欢

热点阅读