0 0

java 使用多线程 批处理问题5

我的需求是 我需要处理一批数据,这些数据放到一个List 里面。单线程是这样的
while(list不为空){
process(list.next());
}

这时发现,每执行一次process需要5分钟。效率太低了。

我希望能够多线程实现批处理。比如每次开10个线程同时执行process(),每一个线程处理一组数据。
while(list不为空){

process(list.next());
process(list.next());
process(list.next());
process(list.next());
.
.
.
.
}

这时发现,这不只是开启了一个线程,而是为每一组数据开了一个线程,电脑崩溃了。

我希望开启线程的数量是10,而当某一个线程执行完一个process()之后。再执行另外一个process处理另外一组数据。如何实现呢?
2013年5月12日 23:21

4个答案 按时间排序 按投票排序

0 0

你的崩溃是不是多线程同时遍历和操作这个list产生的啊?我比较好奇的是什么什么过程需要执行5分钟……没见过这样的,真心求教

2013年5月13日 16:29
0 0

1、你可以采用批量保存,hibernate的实现http://oss.org.cn/ossdocs/framework/hibernate/reference-v3_zh-cn/batch.html

2、如果你要采用多线程保存数据,要注意主键生成策略不要是increment。
java中有个ThreadPoolExecutor,你可以定义线程池中线程的数量,将保存的数据当成task,用线程来处理

2013年5月13日 09:39
0 0

    package com.kuke.auth.log.controller;  
      
    import java.util.ArrayList;  
    import java.util.List;  
    import java.util.Map;  
    import java.util.Vector;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
      
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    import org.springframework.beans.factory.annotation.Autowired;  
    import org.springframework.stereotype.Controller;  
    import org.springframework.web.bind.annotation.RequestMapping;  
      
    import com.kuke.auth.regist.domain.UserActionLog;  
    import com.kuke.auth.regist.domain.UserListenLog;  
    import com.kuke.auth.regist.service.RegistServiceImpl;  
    import com.kuke.core.base.action.AbstractActionBean;  
      
    @Controller  
    @RequestMapping("/kuke/log")  
    public class LogController extends AbstractActionBean {  
      
        private static ExecutorService pool = Executors.newCachedThreadPool();//线程池  
      
        private static List<UserActionLog> userActionList = new ArrayList<UserActionLog>();  
      
        private static List<UserListenLog> userListenList = new ArrayList<UserListenLog>();  
      
        private static List<UserActionLog> tempList;  
      
        private static List<UserListenLog> tempList1;  
      
        @Autowired  
        private RegistServiceImpl registServiceImpl;  
      
        /** 
         *  
         * action log 
         */  
        @RequestMapping(value = "/userAction")  
        public synchronized void userActionLog(HttpServletRequest request,  
                HttpServletResponse response) throws Exception {  
            String userId = this.getLoginUser().getUid();  
      
            Map<String, String> params = getParameterMap(request);  
            String requestIp = params.get("operator_ip");  
            String actionType = params.get("actionType");  
            String start_date = params.get("start_date");  
            String end_date = params.get("end_date");  
      
            UserActionLog useractionlog = new UserActionLog();  
            // useractionlog.setId(IdGenerator.getUUIDHex32());  
            useractionlog.setAction_type(actionType);  
            useractionlog.setUser_id(userId);  
            useractionlog.setStart_state(start_date);  
            useractionlog.setEnd_state(end_date);  
            useractionlog.setChannel_type("");  
            useractionlog.setOperator_ip(requestIp);  
            userActionList.add(useractionlog);  
            if (userActionList.size() == 100) {  
    //          System.out.println("=======1======"+userActionList.size());  
                tempList = new ArrayList<UserActionLog>();  
                tempList.addAll(userActionList);  
                pool.execute(new Runnable() {  
                    public void run() {  
                        try {  
                            registServiceImpl.addUseractionlog(tempList);  
                        } catch (Exception e) {  
                            e.printStackTrace();  
                        }  
                    }  
                });  
                 userActionList.clear();  
                userActionList = new ArrayList<UserActionLog>();  
            }  
        }  
      
        /** 
         * listen log 
         *  
         */  
        @RequestMapping(value = "/userListen")  
        public synchronized void userListenLog(HttpServletRequest request,  
                HttpServletResponse response) throws Exception {  
            String userId = this.getLoginUser().getUid();  
      
            Map<String, String> params = getParameterMap(request);  
            String requestIp = params.get("operator_ip");  
            String l_code = params.get("l_code");  
            String listen_type = params.get("listen_type");  
            String listen_date = params.get("listen_date");  
            String item_code = params.get("item_code");  
            String from_client = params.get("from_client");  
            String cname = params.get("cname");  
            String ename = params.get("ename");  
            String listen_ip = params.get("listen_ip");  
            String channel_type = params.get("channel_type");  
            String org_user_id = params.get("org_user_id");  
            String ischarged = params.get("ischarged");  
      
            UserListenLog userListenLog = new UserListenLog();  
            userListenLog.setListen_ip(requestIp);  
            userListenLog.setL_code(l_code);  
            userListenLog.setListen_type(listen_type);  
            userListenLog.setListen_type(l_code);  
            userListenLog.setListen_date(listen_date);  
            userListenLog.setItem_code(item_code);  
            userListenLog.setFrom_client(from_client);  
            userListenLog.setCname(cname);  
            userListenLog.setEname(ename);  
            userListenLog.setListen_ip(listen_ip);  
            userListenLog.setChannel_type(channel_type);  
            userListenLog.setOrg_user_id(org_user_id);  
            userListenLog.setIscharged(ischarged);  
            userListenLog.setListen_user_id(userId);  
            userListenList.add(userListenLog);  
            if (userListenList.size() == 100) {  
                System.out.println("=======11======"+userListenList.size());  
                tempList1 = new ArrayList<UserListenLog>();  
                tempList1.addAll(userListenList);  
                pool.execute(new Runnable() {  
                    public void run() {  
                        try {  
                            registServiceImpl.addUserListenLog(tempList1);  
                        } catch (Exception e) {  
                            e.printStackTrace();  
                        }  
                    }  
                });  
                userListenList.clear();  
                userListenList = new ArrayList<UserListenLog>();  
            }  
      
        }  
    }  

2013年5月13日 09:34
0 0

1、你的process方法不是处理一个,这个方法要改为一组。
2、主方法进去,将整个list分成10个,假设215,每个线程处理22条。构造线程池,调用线程池方法,传入22条的数据。接着就是调用1的process。

2013年5月13日 09:25

相关推荐

    用JAVA写的一个异步多线程批处理的组件

    在IT行业中,尤其是在Java开发领域,异步多线程批处理是一种常见的技术手段,用于高效地处理大量数据。本文将详细解析标题为“用JAVA写的一个异步多线程批处理的组件”的核心知识点,以及如何利用这个组件来优化大...

    多线程异步批处理模块

    比上一次的版本做了优化和更能上的添加: 增加了把指定事件任务分配给指定线程的功能 增加了吧指定事件任务分配给指定某一类线程的功能 对等待时间进行了优化以提高效率,增加CPU...SampleTest.java为一个样例作为参考

    Java多线程Executors批量执行数据实现限流

    Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...

    java 多线程操作数据库

    ### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...

    用Java多线程写管道过滤器

    使用Java多线程实现管道过滤器,本文档写了六个线程,五个管道,内容很简单,如果想要复杂功能请手动添加。

    Java调用批处理示例

    4. **进程等待**:使用`process.waitFor()`可以让当前线程等待子进程结束,从而确保所有的输出都已读取完毕。 #### 五、高级用法 1. **多命令执行**: ```java String command = "cmd /c dir && ping ...

    JAVA多线程实现数据库之间的数据互导、连接池、及多表插入数据库功能

    1. **Java多线程**: - **线程创建**:Java提供了多种创建线程的方式,如继承Thread类或实现Runnable接口。理解这两种方式的优缺点是基础,例如,实现Runnable接口更利于资源复用。 - **线程同步**:为了避免多...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    MyBatis,作为一个优秀的Java持久层框架,提供了多种优化手段,其中包括多线程和批处理技术。本文将详细介绍如何利用MyBatis结合多线程和CountDownLatch闭锁来实现数据的批量插入。 首先,我们来看`mybatis批处理`...

    文件批处理模块java源码

    3. **多线程与并发**:在批处理中,为了提高效率,通常会使用多线程技术。Java的Thread类和ExecutorService接口可以帮助我们创建和管理线程池,实现并发处理多个文件。 4. **集合框架**:批处理过程中,文件名通常...

    Java操作Oracle数据库-多线程.rar

    本教程主要探讨如何在Java中利用多线程技术高效地与Oracle数据库进行交互,从而实现更强大的并发处理能力。通过"Java操作Oracle数据库-多线程.rar"这个压缩包,我们可以学习到以下几个关键知识点: 1. **JDBC连接**...

    java批处理

    4. **并行处理**:通过多线程或分布式计算(如Hadoop MapReduce)来加速批处理任务。Java的ExecutorService可以方便地创建线程池,实现任务的并发执行。 5. **错误处理和重试机制**:批处理过程中可能会遇到数据...

    javayouxi.rar_JAVA小游戏_batch game_java游戏代码_批处理游戏

    5. **多线程**:在某些情况下,Java游戏可能需要使用多线程来实现并发,比如更新游戏世界和处理用户输入可以同时进行。 6. **批处理编程**:批处理游戏主要在命令行环境中运行,这意味着所有的游戏逻辑、输入输出都...

    Java多线程优化百万级数据

    本篇将深入探讨如何利用Java多线程技术来优化这种高负载场景。 首先,理解Java多线程的基础至关重要。在Java中,线程是程序执行的最小单元,可以通过实现`Runnable`接口或继承`Thread`类来创建线程。创建多线程的...

    java远程调用批处理文件代码归总

    在提供的压缩包文件中,"java+tcp多线程通信.rar"可能包含了实现TCP通信的示例代码,可能包括客户端和服务器端的Java类,以及如何在多线程环境中处理多个并发连接。"远程文件传输.rar"可能涉及如何在客户端和服务器...

    java 批处理的资源

    - **多线程**:利用Java的并发库实现多线程并行处理,提高批处理效率。 - **JDBC批处理**:通过设置批处理边界,一次性提交多条SQL语句,减少数据库交互次数。 - **Java 8 Stream API**:处理大量数据时,Stream ...

    java模拟键盘鼠标

    4. **多线程**: 由于批量登录可能涉及多个账号,因此很可能需要用到多线程技术。Java的`Thread`类或`java.util.concurrent`包下的`ExecutorService`和`Future`接口可以实现并发登录。 5. **自动化框架**: 虽然`...

    文件批处理模块_java_批处理_源码

    - **并发处理**:为了提高效率,可以使用多线程或Java 8的并行流来并发处理多个文件。`ExecutorService`和`Future`接口可以帮助管理和协调这些任务。 6. **异常处理**: 文件操作中常见的异常有`...

    java调用批处理

    在Java编程中,调用批处理操作是一种常见的需求,特别是在处理大量数据或执行自动化任务时。批处理可以提高效率,因为它允许一次性处理多个输入,而不是逐个处理。本篇文章将探讨如何在Java中调用批处理,以及相关的...

    java使用OpenOffice实现的Excel转pfd

    7. **性能优化**:如果需要批量转换大量文件,可以考虑使用多线程技术,或者利用OpenOffice支持的批处理模式,以提高转换效率。 8. **兼容性问题**:虽然OpenOffice对大多数Excel文件格式有良好的支持,但可能会...

    java多线程笔记

    一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename...

Global site tag (gtag.js) - Google Analytics