-
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个答案 按时间排序 按投票排序
-
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
-
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
-
1、你的process方法不是处理一个,这个方法要改为一组。
2、主方法进去,将整个list分成10个,假设215,每个线程处理22条。构造线程池,调用线程池方法,传入22条的数据。接着就是调用1的process。2013年5月13日 09:25
相关推荐
在IT行业中,尤其是在Java开发领域,异步多线程批处理是一种常见的技术手段,用于高效地处理大量数据。本文将详细解析标题为“用JAVA写的一个异步多线程批处理的组件”的核心知识点,以及如何利用这个组件来优化大...
比上一次的版本做了优化和更能上的添加: 增加了把指定事件任务分配给指定线程的功能 增加了吧指定事件任务分配给指定某一类线程的功能 对等待时间进行了优化以提高效率,增加CPU...SampleTest.java为一个样例作为参考
Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...
### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...
使用Java多线程实现管道过滤器,本文档写了六个线程,五个管道,内容很简单,如果想要复杂功能请手动添加。
4. **进程等待**:使用`process.waitFor()`可以让当前线程等待子进程结束,从而确保所有的输出都已读取完毕。 #### 五、高级用法 1. **多命令执行**: ```java String command = "cmd /c dir && ping ...
1. **Java多线程**: - **线程创建**:Java提供了多种创建线程的方式,如继承Thread类或实现Runnable接口。理解这两种方式的优缺点是基础,例如,实现Runnable接口更利于资源复用。 - **线程同步**:为了避免多...
MyBatis,作为一个优秀的Java持久层框架,提供了多种优化手段,其中包括多线程和批处理技术。本文将详细介绍如何利用MyBatis结合多线程和CountDownLatch闭锁来实现数据的批量插入。 首先,我们来看`mybatis批处理`...
3. **多线程与并发**:在批处理中,为了提高效率,通常会使用多线程技术。Java的Thread类和ExecutorService接口可以帮助我们创建和管理线程池,实现并发处理多个文件。 4. **集合框架**:批处理过程中,文件名通常...
本教程主要探讨如何在Java中利用多线程技术高效地与Oracle数据库进行交互,从而实现更强大的并发处理能力。通过"Java操作Oracle数据库-多线程.rar"这个压缩包,我们可以学习到以下几个关键知识点: 1. **JDBC连接**...
4. **并行处理**:通过多线程或分布式计算(如Hadoop MapReduce)来加速批处理任务。Java的ExecutorService可以方便地创建线程池,实现任务的并发执行。 5. **错误处理和重试机制**:批处理过程中可能会遇到数据...
5. **多线程**:在某些情况下,Java游戏可能需要使用多线程来实现并发,比如更新游戏世界和处理用户输入可以同时进行。 6. **批处理编程**:批处理游戏主要在命令行环境中运行,这意味着所有的游戏逻辑、输入输出都...
本篇将深入探讨如何利用Java多线程技术来优化这种高负载场景。 首先,理解Java多线程的基础至关重要。在Java中,线程是程序执行的最小单元,可以通过实现`Runnable`接口或继承`Thread`类来创建线程。创建多线程的...
在提供的压缩包文件中,"java+tcp多线程通信.rar"可能包含了实现TCP通信的示例代码,可能包括客户端和服务器端的Java类,以及如何在多线程环境中处理多个并发连接。"远程文件传输.rar"可能涉及如何在客户端和服务器...
- **多线程**:利用Java的并发库实现多线程并行处理,提高批处理效率。 - **JDBC批处理**:通过设置批处理边界,一次性提交多条SQL语句,减少数据库交互次数。 - **Java 8 Stream API**:处理大量数据时,Stream ...
4. **多线程**: 由于批量登录可能涉及多个账号,因此很可能需要用到多线程技术。Java的`Thread`类或`java.util.concurrent`包下的`ExecutorService`和`Future`接口可以实现并发登录。 5. **自动化框架**: 虽然`...
- **并发处理**:为了提高效率,可以使用多线程或Java 8的并行流来并发处理多个文件。`ExecutorService`和`Future`接口可以帮助管理和协调这些任务。 6. **异常处理**: 文件操作中常见的异常有`...
在Java编程中,调用批处理操作是一种常见的需求,特别是在处理大量数据或执行自动化任务时。批处理可以提高效率,因为它允许一次性处理多个输入,而不是逐个处理。本篇文章将探讨如何在Java中调用批处理,以及相关的...
7. **性能优化**:如果需要批量转换大量文件,可以考虑使用多线程技术,或者利用OpenOffice支持的批处理模式,以提高转换效率。 8. **兼容性问题**:虽然OpenOffice对大多数Excel文件格式有良好的支持,但可能会...
一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename...