0 0

java 多线程处理一个list的集合5

大家好,我的一个List<String>中有10W条记录,要把这个List的的内容拼接起来。我启动5个线程同时处理,每个线程处理2w条记录。然后把5个线程处理的内容拼接起来。 请大家给一个简单的demo。谢谢
2014年4月02日 15:05

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

0 0

采纳的答案

不用这么复杂,这样就好了..

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Test {

	public static void main(String[] args) {
		try {
			List<String> list = new ArrayList<>();
			for (int i = 0; i < 100; i++) {
				list.add(i + ",");
			}
			
			System.out.println(new Test().list2Str(list, 5));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String list2Str(List<String> list, final int nThreads) throws Exception {
		if (list == null || list.isEmpty()) {
			return null;
		}
		
		StringBuffer ret = new StringBuffer();

		int size = list.size();
		ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
		List<Future<String>> futures = new ArrayList<Future<String>>(nThreads);
		
		for (int i = 0; i < nThreads; i++) {
			final List<String> subList = list.subList(size / nThreads * i, size / nThreads * (i + 1));
			Callable<String> task = new Callable<String>() {
				@Override
				public String call() throws Exception {
					StringBuffer sb = new StringBuffer();
					for (String str : subList) {
						sb.append(str);
					}
					return sb.toString();
				}
			};
			futures.add(executorService.submit(task));
		}
		
		for (Future<String> future : futures) {
			ret.append(future.get());
		}
		executorService.shutdown();
		
		return ret.toString();
	}
}

2014年4月03日 11:08
0 0

有个问题,如果5个线程有一个失败,其他线程就会阻塞哦

2014年4月07日 00:34
0 0

2014年4月05日 22:33
0 0

针对 @blackstreet 提出的内存溢出的问题,代码做出如下修改.
1,多加一次list的遍历来预设StringBuffer的长度,而多的这次循环本身几乎没有性能开销(13000000次循环仅70ms左右,当然环境不同实际时间会有偏差)
2,对参数list不进行subList操作,因为我们可以发现list在后续操作中是只读,不涉及并发带来的线程安全问题,所以循环时直接通过index来做取值区间判断.(奇怪的是,去除subList的操作似乎并没有对性能产生什么影响)
3,关于StringBuilder和StringBuffer,13000000数据测试了几次,居然也没有什么差别.不解,可能是jvm默认调了优,也可能我测试数据不够..

总之测试比较少,没有权威性,一切以实际为准.各位就姑且一看吧.

public String list2Str(final List<String> list, final int nThreads) throws Exception {
	if (list == null || list.isEmpty()) {
		return null;
	}

	int len = 0;
	for (String str : list) {
		len += str.length();
	}
	StringBuffer ret = new StringBuffer(len);

	final int size = list.size();
	ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
	List<Future<String>> futures = new ArrayList<Future<String>>(nThreads);
	
	try {
		for (int i = 0; i < nThreads; i++) {
			final int j = i;
			Callable<String> task = new Callable<String>() {
				@Override
				public String call() throws Exception {
					
					int len = 0;
					for (int n = size / nThreads * j; n < size / nThreads * (j + 1); n++) {
						len += list.get(n).length();
					}
					
					StringBuffer sb = new StringBuffer(len);
					for (int n = size / nThreads * j; n < size / nThreads * (j + 1); n++) {
						sb.append(list.get(n));
					}
					return sb.toString();
				}
			};
			futures.add(executorService.submit(task));
		}

		for (Future<String> future : futures) {
			ret.append(future.get());
		}
	} finally {
		executorService.shutdown();
	}
	
	return ret.toString();
}

2014年4月04日 00:32
0 0

刚试了一下list 集合在13000000个
for (int i = 0; i < 13000000; i++) {
list.add("a" + i);

直接用
StringBuilder foreach append:每次稳定6.1秒

多线程在11.7秒时内存jvm outof

环境是在:win7 8个cpu核上运行

意外地的我在运行单线程StringBuilder foreach append这种时,cpu的每个核都是在工作达到100%.

谁解释下

2014年4月03日 17:15
0 0

fork/join框架解决

2014年4月03日 15:38
0 0

import java.util.ArrayList;
import java.util.List;


public class Test7 {

public static void main(String[] args){
List<String> list = new ArrayList<String>();
for(int i=0;i<10;i++){
list.add(i+"");
}
List<StringBuffer> sbs = new ArrayList<StringBuffer>();
for(int i=0;i<5;i++){
sbs.add(new StringBuffer());
}
Thread sumThread =  new Thread(new Sum(sbs));

for(int i=0;i<5;i++){
Thread thread = new Thread(new MyHander(list,i*2,i*2+2,sbs.get(i)));
thread.start();
}
sumThread.start();

}
}

class Sum  implements Runnable{

private List<StringBuffer> sbs;
  public Sum(List<StringBuffer> sbs){
  this.sbs =sbs;
  }
public void run() {
synchronized (this) {
while(true){

if(MyHander.getCounter()<5){
try {
wait(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
break;
}


}
StringBuffer value = new StringBuffer();
for(int i=0;i<5;i++){
value.append(sbs.get(i).toString());
}
System.out.println(value.toString());
}
}
}
class MyHander implements Runnable {

private List<String> list;
private int start;
private int end;
private StringBuffer sb;
private static  Integer counter=0;

public MyHander(List<String> list,int start,int end,StringBuffer sb){
this.list =list;
this.start = start;
this.end = end;
this.sb = sb;

}

public static Integer getCounter(){
return counter;
}


@Override
public void run() {
for(int i=start; i<end;i++){

sb.append(list.get(i));
}
synchronized(counter){
counter++;

}
}

}

2014年4月02日 16:50
0 0

你用这个类啊ArrayDeque,然后启动5个线程 每个线程内部循环2万次 去调用ArrayDeque.poll()方法就行了

2014年4月02日 16:14

相关推荐

    详解Java多线程处理List数据

    下面是一个使用Java多线程处理List数据的示例代码: ``` public class Test_4 { public synchronized void handleList(List&lt;String&gt; data, int threadNum) { int length = data.size(); int tl = length % ...

    java多线程查询数据库

    综上所述,"java多线程查询数据库"是一个涉及多线程技术、线程池管理、并发控制、分页查询等多个方面的复杂问题。通过理解和掌握这些知识点,我们可以有效地提高数据库操作的效率和系统的响应速度。

    Java多线程安全集合

    在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...

    多线程并行执行,汇总结果

    Java提供了多种线程安全的集合,如`ConcurrentHashMap`、`AtomicInteger`等,它们在多线程环境下能够保证数据的一致性和完整性。线程可以在执行过程中将计算结果放入这些线程安全的数据结构,而无需担心数据竞争的...

    JAVA集合、多线程

    2. **线程同步**:为了防止多线程环境下数据的不一致,Java提供了synchronized关键字,可以保证同一时刻只有一个线程访问同步代码块。此外,还有wait()、notify()和notifyAll()方法用于线程间通信。 3. **线程池**...

    java多线程处理数据(csdn)————程序.pdf

    Java多线程处理数据是一种常见的优化策略,尤其在面临大量数据查询时,通过并发执行任务可以显著提升程序的运行效率。以下将详细解释这个程序中的关键知识点: 1. **Callable接口**:`ThredQuery`类实现了`Callable...

    JAVA模拟多线程给多用户发送短信

    在本文中,我们将深入了解如何使用JAVA来模拟多线程...对于需要学习JAVA并发编程和网络编程的开发者来说,本文提供了一个很好的实例来加深理解,并且可以以此为基础进一步深入学习JAVA在实际应用中的多线程处理机制。

    java计算同一个list中是否有相同的值

    3. **多线程处理**:对于非常大的数据集,可以考虑使用多线程技术来加速处理过程。 综上所述,虽然原始方法实现了功能,但在实际应用中,应该优先考虑更高效的方法。选择哪种优化策略取决于具体的应用场景和性能...

    Java集合多线程安全.docx

    线程安全指的是一个对象在多线程环境下可以被正确地访问和修改,而不会出现竞态条件或死锁等问题。 线程不安全的集合类包括: 1. `ArrayList`:它的添加、删除和修改操作不是线程安全的。例如,在多个线程同时尝试...

    java实现多线程购票系统

    本文将深入探讨如何使用Java实现一个多线程购票系统,并涉及同步锁机制以及集合的减法操作。 首先,我们要创建一个`Ticket`类,代表票务对象,包含票号和座位信息。这个类应该包含必要的属性和方法,例如获取和设置...

    Java List集合的应用.rar

    Java List集合是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,主要用于存储一组有序的、可重复的对象。List接口提供了许多方法,使得在处理列表数据时具有很高的灵活性和效率。在这个“Java List...

    java基础(多线程,IO,集合,网络编程,泛型)

    本资源包“java基础(多线程,IO,集合,网络编程,泛型)”提供了对Java核心技术的全面介绍,包括五个核心主题:多线程、输入/输出(IO)、集合框架、网络编程和泛型。以下是对这些主题的详细讲解: 1. **多线程**: - ...

    Java多线程--让主线程等待所有子线程执行完毕

    在Java多线程环境中,让主线程等待所有子线程执行完毕是一个常见的需求,尤其是在处理大量数据或进行高性能计算时。这不仅有助于正确测量整体执行时间,还能够确保资源的正确释放和数据的一致性。 #### 详细解析 *...

    java基础,多线程,反射

    首先,我们来讨论Java多线程。多线程允许程序同时执行多个独立的任务,极大地提高了应用程序的效率和响应性。在Java中,可以使用`Thread`类或实现`Runnable`接口来创建线程。线程间通信和同步是多线程编程的关键,...

    javalist.zip_list集合 java

    "javalist.zip_list集合 java"这个标题暗示我们将探讨Java中的List集合以及它的应用。描述中提到“java中集合list的应用非常重要”,这确实不假,因为List在处理有序数据时具有广泛的应用场景。 List接口位于java....

    java多线程设计模式详解

    在深入探讨Java多线程设计模式的知识点之前,让我们首先明确多线程编程在Java中的地位和作用。Java自诞生之日起就内置了对多线程编程的支持,这使得开发能够充分利用多核处理器性能的应用程序成为可能。多线程设计...

    java 集合

    `List`接口定义了一个有序的、允许重复元素的集合,如`ArrayList`和`LinkedList`是它的实现类;`Set`接口则不允许重复元素,`HashSet`和`TreeSet`是常见的实现;`Queue`接口用于表示先进先出(FIFO)的数据结构,如`...

    两个集合比较(新增、编辑、删除)

    在IT领域,集合比较是一...通过理解并熟练运用这些方法,我们可以有效地比较和操作两个List集合,无论是查找新增、编辑还是删除的元素。在实际项目中,这种能力对于数据同步、日志分析、版本控制等多个场景都至关重要。

    java核心知识,集合,多线程

    **Java多线程** 多线程是Java的重要特性,使得程序可以同时执行多个任务,提高系统效率。 1. **Thread类**:创建新线程的基本方式是继承Thread类并重写run()方法。 2. **Runnable接口**:另一种方式是实现...

Global site tag (gtag.js) - Google Analytics