`
362217990
  • 浏览: 51892 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

用多个线程处理1个List集合

阅读更多
  昨天发了一个提问,启动5个线程将一个List中的内容,然后将5个线程的内容拼接起来,由于时间比较急迫,自己就写了一个Demo,希望对菜鸟有参考意义。。


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

public class ThreadTest {

	private static final int total = 100000;
	
	public static void test1() throws InterruptedException {
		List<String> datas = new ArrayList<String>(total);
		for(int i =0; i< total; i++){
			datas.add(i+"");
		}
		StringBuffer sb = new StringBuffer();
		long s = System.currentTimeMillis();
		for(int i =0; i< datas.size(); i++){
			sb.append(datas.get(i));
		}
		long e = System.currentTimeMillis();
		System.out.println("单线程执行所需时间:" +(e-s));
	}
	
	
	public static void test2() throws InterruptedException {
		List<String> datas = new ArrayList<String>(total);
		for(int i =0; i< total; i++){
			datas.add(i+"");
		}
		int threadSize = 5;
		int size = datas.size();
		int x = size / threadSize;
		StringBuffer result = new StringBuffer();
		CountDownLatch doneSignal = new CountDownLatch(threadSize);
		long s = System.currentTimeMillis();
		for(int i= 0; i< threadSize ;i++){
			int start  = i * x;
			int end = (i+1) < threadSize ? (i+1) * x :  size;
			Thread t = new Thread(new WorkerRun(doneSignal, datas, start, end, result));
			t.start();
		}
		doneSignal.await();
		long e = System.currentTimeMillis();
		System.out.println("多线程执行所需时间:" +(e-s));
	}
	
	public static void main(String[] args) throws InterruptedException {
		test1();
		test2();
	}
	
}

class WorkerRun implements Runnable{

	private final CountDownLatch doneSignal;
	
	private List<String> datas = null;
	
	private int start;
	
	private int end;
	
	private StringBuffer result = null;
	
	public WorkerRun(CountDownLatch doneSignal,List<String> datas ,int start, int end,StringBuffer result){
		this.doneSignal = doneSignal;
		this.datas = datas;
		this.start = start;
		this.end = end;
		this.result = result;
	}
	
	@Override
	public void run() {
		StringBuffer sb = new StringBuffer();
		for(int i = start; i< end ;i ++){
			String str = datas.get(i);
			sb.append(str);
		}
		result.append(sb);
		//执行完成后等待
		doneSignal.countDown();
	}
}



另外说一点,我发现多线程这样处理比单线程数据差不多慢了一倍,有点不解。也请大神指教。。

运行的结果:
单线程执行所需时间:6
多线程执行所需时间:18


分享到:
评论

相关推荐

    C#多线程List的非线程安全性

    然而,List并未设计为线程安全的容器,这意味着在多个线程同时访问和修改List时,可能会引发数据竞争和不一致的情况。标题中提到的“List添加对象的误区”主要体现在多线程环境下对List&lt;T&gt;.Add()方法的并发调用。 ...

    详解Java多线程处理List数据

    Java多线程处理List数据是指使用多个线程来处理List数据的操作。这种操作可以将List数据分配给多个线程,每个线程处理一部分数据,从而提高程序的执行效率。 二、为什么需要Java多线程处理List数据? 在处理大规模...

    Java多线程安全集合

    这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程安全集合类,它们是专门为多线程环境设计的。 首先,我们要了解什么是线程安全。线程...

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

    `CountDownLatch`是Java并发包(java.util.concurrent)中的一个计数器类,它允许一个或多个线程等待其他线程完成操作。在初始化时,`CountDownLatch`需要一个非负整数作为计数器的初始值。每次调用`countDown()`...

    Java集合多线程安全.docx

    例如,在多个线程同时尝试修改列表时,可能会抛出`ConcurrentModificationException`。 2. `LinkedList`:与`ArrayList`类似,其迭代器也不是线程安全的,因此并发修改会导致异常。 3. `HashMap`:并发写入可能导致...

    JAVA集合、多线程

    集合是Java提供的一种数据结构,用于存储多个对象。Java集合框架包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。理解这些接口和类的特性和用法是Java开发者必备的基础...

    c# 委托访问listbox多线程操作

    - **线程** 是程序执行流的基本单元,一个程序至少有一个线程(主线程)。 - **多线程** 允许程序同时执行多个任务,提高应用程序的性能和响应性。 **2. 委托:** - **定义**:C# 中的委托是一种引用类型数据,...

    多线程集合及IO面试

    - **synchronized关键字**:可以用于修饰方法或代码块,当多个线程试图访问同一个对象的同步方法或同步代码块时,只有一个线程可以进入该方法或代码块。 - **ReentrantLock**:是一个可重入的互斥锁,提供了与...

    多线程及list使用.zip

    多线程是程序设计中的一个概念,它允许多个任务在单个程序中同时执行。在计算机系统中,每个线程都是独立的执行单元,有自己的程序计数器、系统寄存器以及栈。通过多线程,可以充分利用多核处理器的计算能力,提高...

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

    splitList()方法通过计算页数和页码的方式来将大列表分割成若干小列表,这里使用了整除和加1操作来确保每个用户都能被分配到一个线程。 每个子列表随后被封装到UserThread对象中,后者是一个实现了Runnable接口的类...

    java多线程查询数据库

    在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....

    将一个比较大的list分割为多个小的list

    将一个比较大的list分割为多个小的list,可以解决mybatis批量插⼊数据list超过⼀定长度时报错的解决办法

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

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

    本项目包括利用多线程、select、poll以及epoll实现的并发处理连接请求

    这两类都要使用到IO多路复用,O多路复用是指单个进程/线程就可以同时处理多个IO请求。有三个方式select、poll、epoll。 select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间...

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

    这里使用`Executors.newFixedThreadPool(threadNum)`创建了一个固定大小的线程池,线程池的大小为5,这意味着最多同时有5个线程执行任务。 3. **Fork/Join框架**:虽然代码中没有直接使用Fork/Join框架,但`...

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

    - **线程概念**:线程是程序中的执行单元,一个进程中可以有多个线程同时执行。 - **创建线程**:Java提供两种方式创建线程,通过实现Runnable接口或继承Thread类。 - **线程状态**:线程有新建、就绪、运行、...

    C#-多线程排序示例

    3. **线程操作**:在每个线程内部,我们可以使用内置的排序方法(如Array.Sort或List&lt;T&gt;.Sort)对分配的数据子集进行排序。 4. **线程同步**:为了确保所有线程完成排序后能将结果合并,我们需要使用同步机制。这...

    Java List集合的应用.rar

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

    基于Java实现的forkjoin并行任务注解工具, 用于springboot项目下对大量数据单线程处理的性能问题

    基于Java实现的forkjoin... 比如有一个List类型的集合list,需要需要对list中的每个元素进行处理,然后返回处理以后的结果,但是由于list的size太大,处理速度慢,需要将list进行并行化处理,并将结果汇总,就可以使用

    java多线程实现一个控制台聊天室

    1. **服务器端**:负责接受来自多个客户端的连接请求,并为每个客户端创建一个独立的处理线程。 2. **客户端**:用于向服务器发送消息以及接收其他客户端发送的消息。 #### 三、关键技术点 ##### 1. 服务器端实现 ...

Global site tag (gtag.js) - Google Analytics