使用多线程优化批量导入的回显功能

最近参与开发的项目有批量导入数据的功能,导入回显的过程中需要做一些校验,以确保导入数据的正确性。如果导入的数据特别多,校验规则也特别多,那么一条一条校验的时间就会很长,影响系统使用。这个时候可以使用多线程来并行校验。这里记录一下,以防忘掉。

一般要导入的每一条数据的校验都是相互独立的,那么让几条数据并行校验不会影响其他数据。基于这个思想,使用多线程优化导入。

笔者所在项目使用了SSM框架,代码实现是在service层(这里只是基于本人的工作环境而这样写,如果不是这样的环境,实现思想也是一样的。)
实现如下:
(1)新建一个ImportServiceImpl.java类,里面创建一个回显方法ehcoImportInfo()方法,和一个内部类ThreadParallel,实现Callable接口(如果没有返回值,也可以实现Runnable接口)。

public class ImportServiceImpl  {
    //内部类(线程类)
    private class ThreadParallel implements Callable<Object>{
        //内部类无参构造方法,如果需要传递参数来启动线程,则定义相应的有参构造方法
        public ThreadParallel() {
        }
        @Override
        public Object call() throws Exception {
            //具体的校验代码放在这里处理
            return null;
        }
    //回显方法
    public void ehcoImportInfo() {
        //这个方法里面将调用内部类ThreadParallel 
    }
}

(2)在这个ehcoImportInfo方法中使用这个内部类。

public void ehcoImportInfo() {
        int listSize = 3000; // 导入3000条数据
        // 根据导入的数据量确定启动线程的个数(根据实际情况来确定)
        int threadNum = 0; // 记录线程数量
        if (listSize > 0 && listSize < 100) {
            threadNum = 1;
        } else {
            if (listSize >= 1000 && listSize <= 3000) {
                threadNum = 10;
            } else {
                if ((listSize % 100) == 0) {
                    threadNum = listSize / 100;
                } else {
                    threadNum = listSize / 100 + 1;
                }
            }
        }

        List<Object> subList; // 存放一个范围内的导入数据
        int count =1; // 行号
        // 存放所有分割的数据
        Map<Integer, Object> map = new HashMap<Integer, Object>(); 
        // 分割导入的数据 
        for (int i = 0; i < threadNum; i++) {
            subList= new ArrayList<Object>();
            for (int j = (listSize/threadNum)*(count-1); j < (listSize/threadNum)*count; j++) {
                mList.add(list.get(j));
            }
            map.put(i, mList);
            count ++;
        }
        // 存放线程返回值
        List<Future> futureList = new ArrayList<Future>(); 
        ExecutorService executorService = Executors.newFixedThreadPool(threadNum); // 创建线程池
        // 创建线程,并启动线程(这是关键,这里面创建了内部线程类的对象,里面传的参数,根据实际情况决定,相应的内部类中也要有对应的构造方法。利用submit可以启动线程,)
        for (int x = 0; x < map.size(); x++) {
            futureList.add(executorService.submit(new ThreadParallel(map.get(x),(listSize/threadNum)*x + 1))); 
        }
        executorService.shutdown(); // 关闭线程池
        // 拼接提示信息
        for (Future future : futureList) {
            try {
                System.out.println(future.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }

这只是大致的结构,代码并不完整,主要是理解这种思想和做法。总结一下:就是在方法中使用内部线程类,将大批量数据划分成小批量数据,然后每一个小批量数据启用一个线程并行运行,然后再汇总结果(不需要返回值的就不用处理结果了),这样可以成倍地降低校验时间。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
动化构建和打包? 86. 行编辑器中如何实现代码片段的自动化部署和发布可以使用以下步骤来实现多图片的上传和回显功能: 1. 在HTML中添加一个input标签,type? 87. 行编辑器中如何实现代码片段的自动化监控和优化? 88. 行编辑器属性设置为file,multiple属性设置为true,表示可以选择多个文件: ```html <input type="file" multiple="true中如何实现代码片段的自动化测试和修复? 89. 行编辑器中如何实现代码片" id="upload" name="upload[]" /> ``` 2. 使用jQuery监听input标签的change事件,获取选择的文件: 段的自动化维护和更新? 90. 行编辑器中如何实现代码片段的自动化备份```javascript $('#upload').on('change', function() { var files = $(this).prop('files'); // 处理文件和恢复? 91. 行编辑器中如何实现代码片段的自动化扩展和优化? 92. }); ``` 3. 对于每个选择的文件,使用FormData对象创建一个表单数据对象,用于上传文件: 行编辑器中如何实现代码片段的自动化测试和验证? 93. 行编辑器中如何实现```javascript $('#upload').on('change', function() { var files = $(this).prop('files'); $.each(files, function(index, file) { var formData = new FormData(); formData.append('file', file); // 上传文件 }); 代码片段的自动化文档生成和维护? 94. 行编辑器中如何实现代码片段的自}); ``` 4. 使用jQuery的ajax方法上传文件,同时在服务器端处理上传的文件并返回文件的URL,以便动化性能测试和优化? 95. 行编辑器中如何实现代码片段的自动化安全测试在前端进行回显: ```javascript $('#upload').on('change', function() { var files = $(this).prop('和修复? 96. 行编辑器中如何实现代码片段的自动化质量控制和审查? files'); $.each(files, function(index, file) { var formData = new FormData(); formData.append('file', file); 97. 行编辑器中如何实现代码片段的自动化部署和升级? 98. 行编辑器中 $.ajax({ url: '/upload', type: 'POST', data: formData, processData: false, contentType: false如何实现代码片段的自动化管理和维护? 99. 行编辑器中如何实现代码片段, success: function(response) { // 处理回显 } }); }); }); ``` 5. 在服务器端的自动化分析和评估? 100. 行编辑器中如何实现代码片段的自动化验证和处理上传的文件,将文件保存到服务器上的指定目录,并返回文件的URL: ```php <?php if审查? 希望这些知识点对您有所帮助。如果您有任何问题或需要进一步的解释,请随时联系我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值