- 浏览: 924702 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (322)
- Hibernate研究&源码 (27)
- Server (10)
- Coder碎语 (64)
- EnglishMulling (11)
- About XML (1)
- persistence (12)
- Core Java & OO (23)
- Java EE (6)
- JavaScript/JSON/Ajax/ext... (22)
- 我的读书笔记 (16)
- Source Codes Study (29)
- workFlow/jBPM (22)
- OFBiz: Open For Business (1)
- 项目积累 (21)
- srcStudy_acegi (1)
- Cache/Ehcache... (9)
- Java Test/JUnit.. (7)
- maven/ant (2)
- 设计模式 (1)
- SOA/cxf/ws-security (2)
- Android (4)
- 云计算/Hadoop (2)
- 加密/签名 (1)
- 正则表达式 (1)
- htmlparser (1)
- 操作系统 (5)
- DB (1)
最新评论
-
天使建站:
这里这篇文章更详细 还有完整的实例演示:js跳出循环 ...
jQuery中each的break和continue -
heshifk:
刚刚我也遇到同样的问题,然后就在纠结为什么不能直接使用brea ...
jQuery中each的break和continue -
masuweng:
不错写的.
集万千宠爱于一身的SessionImpl:get研究(四): Hibernate源码研究碎得(8) -
muzi131313:
这个老是忘,做一下笔记还是挺好的
jQuery中each的break和continue -
lg068:
data = data.replace("\n&qu ...
项目小经验: eval与回车符
假定任务是这样的: 对于给定字符串,如“threadTest”, 给它再续上个“@”, 最后返回结果。 这些单条任务间没有任何的依赖关系。
假定这样的字符串很多, 如1000个, 而可以创建的线程数不能多于35个。
于是, 就有了线程创建后, 分配任务的问题, 怎么能在代码上优雅地把给定任务组,分配到线程池中, 然后再去收集这些线程处理后的结果?
想用java.util.concurrency中的Future, 可这个好像不能支持批量结果的收集吧?
于是, 用线程很原始地写了个粗暴分配任务与收集结果的代码, 这个很丑陋的。 大家说怎么改进,设计?
========下面是我粗陋实现的代码===========
package rmn.thread; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class TaskAssignAndResultCollection { private final static int DEFAULT_THREAD_NUM = 5; private int threadNum = DEFAULT_THREAD_NUM; private Worker[] threads = null; public TaskAssignAndResultCollection(int threadNum) { super(); if (threadNum == 0) { threadNum = DEFAULT_THREAD_NUM; } else { this.threadNum = threadNum; } } public Map<String, String> processStringBatchly( String[] datas) { if (threads == null) { synchronized (this) { threads = new Worker[threadNum]; for(int i = 0 ; i < threadNum; i++) { threads[i] = new Worker(); } } } // 怎么把domainName分配给线程, 让它们自己运行去?平均分配, int domainSize = datas.length; int domainNamePerThread = domainSize / threadNum; int leftDomainName = domainSize % threadNum; List<String> listDomainName = Arrays.asList(datas); //先每个线程平均地分domainNamePerThread个DomainName, int endIndex = 0; for (int i=0; i<threadNum; i++) { int beginIndex = i * domainNamePerThread; int step = domainNamePerThread; endIndex = beginIndex + step; List<String> subDomainNames = new ArrayList<String>(listDomainName.subList(beginIndex, endIndex)); threads[i].setDomainNameList(subDomainNames); } //然后,再把剩下的逐个分配。 for(int i=0; i< leftDomainName; i++) { threads[i].addDomainName(listDomainName.get(endIndex + i)); } for(Worker thread : threads ) { thread.start(); try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } Map<String, String> totalResult = new HashMap<String, String>(); for(Worker thread : threads) { totalResult.putAll(thread.getResultCollector()); } return totalResult; } public static void main(String[] args) { String[] datas = new String[] {"baidu.com", "sohu.com", "163.com", "iteye.com"}; TaskAssignAndResultCollection c = new TaskAssignAndResultCollection(3); Map<String, String> resultCollector = c.processStringBatchly(datas); c.showMsg(resultCollector); } private void showMsg(Map<String, String> result) { for(Map.Entry<String, String> me : result.entrySet()) { String data = me.getKey(); String r = me.getValue(); String msg = "原始值[" + data + "]" + " 处理后[" + r + "]" ; System.out.println(msg); } } } class Worker extends Thread { private List<String> datas; private Map<String, String> resultCollector = new HashMap<String, String>(); public void run() { for (String d : datas) { String result = d + "@"; resultCollector.put(d, result); } } public void setDomainNameList(List<String> subDomainNames) { datas = subDomainNames; } public void addDomainName(String domainName) { if (datas == null ) { datas = new ArrayList<String>(); } datas.add(domainName); } public Map<String, String> getResultCollector() { return resultCollector; } }
评论
8 楼
rmn190
2011-07-29
线程池对象threads中上次调用数据的清空, 及清空时的线程安全问题。
7 楼
admires
2011-07-28
rmn190 写道
admires 写道
需要执行Executor.shutdown();
你这是执行完任务没有关闭线程池..
你这是执行完任务没有关闭线程池..
哦,我明白了,你使用的接口是Executor,这里可以使用ExecutorService作为接口的,他的里面就有shutdown()方法。另对于这样的任务,从性能的角度,可以考虑下使用Executors.newCachedThreadPool();
Executor e = Executors.newFixedThreadPool(threadNum); CompletionService<RequestAndResult> ecs = new ExecutorCompletionService<RequestAndResult>(e); for (String d : datas ) { //对于每一个数据都要创建一个CallableWorker, //很不花算。再怎么改进?能不能创建一个Callable? ecs.submit(new CallableWorker(d)); } List<RequestAndResult> results = new ArrayList<RequestAndResult>(); for(int i =0; i<datas.length; i++) { RequestAndResult r = ecs.take().get(); results.add(r); }
问下, 我这里的这些代码, 可以通过哪个对象来调用shutdown?
6 楼
rmn190
2011-07-27
admires 写道
需要执行Executor.shutdown();
你这是执行完任务没有关闭线程池..
你这是执行完任务没有关闭线程池..
Executor e = Executors.newFixedThreadPool(threadNum); CompletionService<RequestAndResult> ecs = new ExecutorCompletionService<RequestAndResult>(e); for (String d : datas ) { //对于每一个数据都要创建一个CallableWorker, //很不花算。再怎么改进?能不能创建一个Callable? ecs.submit(new CallableWorker(d)); } List<RequestAndResult> results = new ArrayList<RequestAndResult>(); for(int i =0; i<datas.length; i++) { RequestAndResult r = ecs.take().get(); results.add(r); }
问下, 我这里的这些代码, 可以通过哪个对象来调用shutdown?
5 楼
admires
2011-07-27
需要执行Executor.shutdown();
你这是执行完任务没有关闭线程池..
你这是执行完任务没有关闭线程池..
4 楼
rmn190
2011-07-27
fjjiaboming 写道
Hadoop
ReduceMap
ReduceMap
感觉到这个思想还是跟Hadoop靠近的, 但小任务还是惊动不起Hadoop的。
3 楼
fjjiaboming
2011-07-27
Hadoop
ReduceMap
ReduceMap
2 楼
rmn190
2011-07-27
我用了ExecutorCompletionService后, 通过Eclipse发现, 程序完成后, 并没有彻底退出。
用正文中提到的粗陋实现时, Eclipse显示彻底退出了。
这是怎么回事?
1, Eclipse的显示有问题?
2, 还是我使用ExecutorCompletionService不当?
用正文中提到的粗陋实现时, Eclipse显示彻底退出了。
这是怎么回事?
1, Eclipse的显示有问题?
2, 还是我使用ExecutorCompletionService不当?
1 楼
rmn190
2011-07-27
有些改进, 但还是不理想, 具体实现代码如下:
package rmn.thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.Executors; public class TaskAssignAndResultCollection2 { private final static int DEFAULT_THREAD_NUM = 5; private int threadNum = DEFAULT_THREAD_NUM; public TaskAssignAndResultCollection2(int threadNum) { super(); if (threadNum == 0) { threadNum = DEFAULT_THREAD_NUM; } else { this.threadNum = threadNum; } } public List<RequestAndResult> processStringBatchlyCompl( String[] datas) throws InterruptedException, ExecutionException { Executor e = Executors.newFixedThreadPool(threadNum); CompletionService<RequestAndResult> ecs = new ExecutorCompletionService<RequestAndResult>(e); for (String d : datas ) { //对于每一个数据都要创建一个CallableWorker, //很不花算。再怎么改进?能不能创建一个Callable? ecs.submit(new CallableWorker(d)); } List<RequestAndResult> results = new ArrayList<RequestAndResult>(); for(int i =0; i<datas.length; i++) { RequestAndResult r = ecs.take().get(); results.add(r); } return results; } public static void main(String[] args) throws Exception { String[] datas = new String[] {"baidu.com", "sohu.com", "163.com", "iteye.com"}; TaskAssignAndResultCollection2 c = new TaskAssignAndResultCollection2(3); List<RequestAndResult> rs = c.processStringBatchlyCompl(datas); for(RequestAndResult rr : rs) { String data = rr.data; String r = rr.afterProcessed; String msg = "原始值[" + data + "]" + " 处理后[" + r + "]" ; System.out.println(msg); } } } class RequestAndResult { String data; String afterProcessed; public RequestAndResult(String data, String afterProcessed) { super(); this.data = data; this.afterProcessed = afterProcessed; } } class CallableWorker implements Callable<RequestAndResult> { String data; public CallableWorker(String data) { super(); this.data = data; } @Override public RequestAndResult call() throws Exception { String afterProcessed = data + "@"; RequestAndResult r = new RequestAndResult(data, afterProcessed); return r; } }
发表评论
-
Java实现将源文件中的注释替换成空行。
2011-12-27 15:39 2797以Css文件为例, 为了能准确地定位,需要把段注释也要替换 ... -
JVM内存溢出问题分析排查
2011-10-25 10:27 3746内存溢出与数据库锁表的问题,可以 ... -
ant运行java程序时, 它不能加载指定properties文件, 怎么处理?
2011-07-27 17:47 3722运行时, 目录结构如下: . ... -
File类createNewFile时的一个注意点
2010-11-03 17:42 26578今天体会到一个陷阱,刚开始还觉得是JDK的bug呢 ... -
要static还是不要static?
2010-09-25 14:18 1208内部接口声明加不加static没什么不同 附件Inn ... -
线程join方法的理解
2010-08-22 11:11 2435一个偶然机会,又接 ... -
should effort go into reuse above maintainability and extensibility?
2010-06-04 09:37 1305Master and Student Maste ... -
对接口编程的一些思考
2009-04-10 08:41 1256对一个问题的持续深追,又想起了Java中接口编 ... -
JVM创建一个新对象到底有多大的代价?
2009-04-02 09:54 1624好像是在听一人讲JVM性能调优方面事时, 知道 ... -
序列化(二): 为什么要序列化?
2009-03-20 08:25 1950在readResolve()方法与序列化中, 由r ... -
序列化(一): readResolve()方法与序列化
2009-03-17 10:08 3123在CJC(一) 中提到一个问题,即 readResolve方 ... -
Core Java: 继承覆盖时的一个问题
2009-02-23 21:01 1262看如下Java代码: public class Main { ... -
CoreJava: 父子类都需要实现同一个接口?
2009-02-18 16:16 2451前些写用LinkedHashSet带来的思考(http ... -
Spring中配置Qaurtz时的singlton问题
2008-11-23 17:24 1570上一篇中用TimerTask做了个简单的实验, ... -
试下Spring的scheduledTask: 不应该出问题的问题
2008-11-21 20:39 3099要用Spring的scheduledTask了 ... -
在Java里不用Socket而直接操作远程计算机里的文件.
2008-06-25 18:27 2804今天上班时偶然发现在Java里可以在不用Socket情况下操作 ... -
about @SuppressWarnings.
2008-06-24 13:50 7677about @SuppressWarnings. ... -
<Java.JavaEE面试整理>(10) --"标签"接口,重载vs覆盖........
2008-04-04 15:46 2183Q 13: Java中为什么有些接口里并没有定义任何方法? L ... -
java.sql.Timestamp转为相应字符串的问题及解答
2008-04-01 14:28 2905工作中用到了java.sql.Timestamp这个类,先不说 ... -
"异常"的梦
2008-03-24 08:33 1325"不对呀,电子地图上 ...
相关推荐
标题中的"通过多线程任务处理大批量耗时业务并返回结果"指的是在Java或其他支持多线程的编程语言中,如何有效地分配工作到多个线程,以便同时处理大量任务,并在任务完成后收集和处理结果。 描述中提到的"当监测到...
通过这个课程设计,学生不仅能掌握Java网络编程和多线程的基础知识,还能实际应用这些技术解决实际问题,提升其在未来工作中处理类似任务的能力。此外,课程设计报告的编写也是对学生书面表达能力和技术文档编制能力...
2. **优点**:提升CPU利用率,提高程序响应速度,尤其在处理大量数据或I/O密集型任务时,多线程能显著提升加解密效率。 3. **线程安全**:在多线程环境中,需要注意RC4算法的线程安全问题,例如防止状态数组在同一...
在讨论多核多线程编程时,我们首先需要了解几个核心概念:多核、多线程、并发编程。多核指的是中央处理器(CPU)中集成多个处理核心的设计,每个核心都可以独立执行运算任务。多线程则是操作系统中能同时运行多个...
在“鱼刺线程池例程”中,可能实现了一种特定的线程池,该线程池在多线程环境下优化了线程的分配和任务的调度,提高了并发处理的效率。 紧接着,哈希表作为数据结构中的“明星”,它的高效性能主要体现在查找、插入...
标题中的“LanScan (多线程的局域网扫描组)”是一款基于Delphi开发的软件,主要用于局域网内的扫描任务。它利用了多线程技术,提升了扫描效率,能够在短时间内快速完成对指定IP段的扫描。描述中提到,这款组件在三...
在多线程环境中,数据采集线程可能通过API接口或者特定的驱动程序与硬件通信,然后将收集到的数据通过队列或其他同步机制传递给主线程或专门的处理线程进行分析和存储。为了保证数据的完整性和一致性,必须注意线程...
4. **任务调度器(Task Scheduler)**:负责将任务分配给合适的线程执行。这可能涉及到优先级排序、线程亲和性选择或其他策略,以优化任务的执行顺序。 5. **线程安全的数据结构和同步机制**:在多线程环境中,数据...
在IT行业中,多线程是程序设计中的一个重要概念,尤其在服务器端开发、并发处理以及高性能计算领域。这个“多线程面试专题及答案.zip”压缩包文件包含了一个PDF文档,很可能是为准备IT面试的求职者提供的学习资料,...
在本案例中,我们将深入讨论如何使用Python的multiprocessing模块来实现多线程的文件拷贝操作,以及相关的操作技巧。 首先,要理解本案例中提到的核心概念——多线程与多进程。在计算机科学中,线程是操作系统能够...
在本讲"第五讲-Java对象运行机制与多线程2019-V31"中,我们将深入探讨Java编程语言的核心概念,特别是Java对象的运行机制和多线程。这些知识点对于理解和优化Java程序的性能至关重要。 首先,Java是一种面向对象的...
在Java编程中,多线程是实现并发执行任务的关键技术。本文将深入探讨Java线程的六个状态以及线程组的概念。 首先,让我们详细了解一下Java线程的六种状态: 1. **新建状态 (NEW)**: 当我们使用`new Thread()`创建...
- 临界区:通过控制多线程的串行化访问。 - 互斥对象:使用`synchronized`关键字或`Lock`实现。 - 信号量:限制同时访问资源的线程数量。 - 事件对象:通过事件通知实现同步。 15. **Java线程同步方式**: - ...
- `ptrarray.cpp`:可能是一个自定义的数据结构,用于存储和管理指针数组,例如在处理多个进程或线程时使用。 - `asm.cpp`:可能包含汇编语言代码,用于实现某些性能关键的低级功能。 - `Page.cpp`:可能是一个...
Java支持多线程编程,这使得程序能够同时处理多个任务。线程同步和通信是Java并发编程的关键,包括锁(synchronized关键字)、死锁、活锁、阻塞队列等概念。掌握这些,可以编写出高效、稳定的并发程序。 Java集合...
本文的标题"通用警报处理程序-多线程的实际示例"聚焦于如何利用多线程来设计一个通用的模块,以便在不同的场景下处理警报。下面将详细讨论多线程的基本概念、在C#中的实现以及如何通过Microsoft CLR Profiler进行...
在IT领域,线程、进程、内存分配以及操作系统的工作站模式与服务器模式是核心概念,对于软件开发,尤其是使用C# .NET框架在Windows环境下进行VS2013开发的开发者来说,理解这些概念至关重要。 首先,让我们深入理解...
文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...
4. **使用多线程**:为了更准确地监测CPU使用率,我们可以使用多线程同时获取系统信息,这样可以减少因获取信息过程本身带来的CPU使用量对结果的影响。 5. **处理结果**:将收集到的CPU使用率数据进行平均,或者...
关于`ChannelHandler`在多线程环境下的线程安全性问题。 ##### 6.2 解答 `ChannelHandler`默认不是线程安全的,因此需要确保在更新状态或共享资源时采取适当的同步措施。 ##### 6.3 一些特例 特殊情况下的线程...