`
362217990
  • 浏览: 50723 次
  • 性别: 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


分享到:
评论

相关推荐

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

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

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

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

    Java集合框架.pdf

    Java集合框架是一个抽象数据类型的框架,它提供了一组接口和类,可用于处理各种类型的数据结构,如列表、队列、集、映射等。 Java集合框架的主要特点是: 1、可扩展性:Java集合框架提供了一组可扩展的接口和类,可...

    java对大数据的处理.pdf

    } } 数据处理:这⾥的思路也是将数据⼩化然后处理,这⾥使⽤了多线程,设定单个线程处理量,然后开启多个线程处理,这⾥需要考虑你的服 务器的承载能⼒,如果线程开得太多了,处理不过来,会出现蹦死的情况。...

    C#中的多线程小试牛刀

    建一个winform窗体,在窗体中放上一个开始按钮,一个停止按钮,一个文本框,在窗体中声明一个List类型的属性,点击开始按钮后开启10个线程,所有线程同时不间断的给List集合中添加1-10000之间的随机数,要求添加List...

    java集合-ConcurrentSkipListSet的使用

    ConcurrentSkipListSet 是Java中的一个线程安全的有序集合类,它基于跳表(Skip List)数据结构实现。 下面是关于 ConcurrentSkipListSet 的一些重要信息: 线程安全性:ConcurrentSkipListSet 是线程安全的,可以...

    C#多线程等待所有子线程结束的示例

    在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步, 做法如下: //在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步,做法...

    开启Java8并行流,算法时间大幅提升.docx

    什么是并行流: 并行流就是将一个流的内容分成多个数据块,并用不同的线程分别处理每个不同数据块的流。例如有这么一个需求: 有一个 List 集合,而 list 中每个 apple 对象只有重量,我们也知道 apple 的单价是 5...

    mybatis 批量将list数据插入到数据库的实现

    主要介绍了mybatis 批量将list数据插入到数据库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java 面试资源(基础 多线程)

    包含四个文件:java 基础上 基础下,多线程和集合。 Java集合框架的基础接口有哪些 Collection 和 Collections 有什么区别 List、Set、Map是否继承自Collection接口 Collections.sort排序内部原理 HashMap 的实现...

    java面试宝典

    94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...

    超级有影响力霸气的Java面试题大全文档

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    JAVA面试题最全集

    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

    电信面试题

    如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。 备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是...

    java 面试题 总结

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    Java八股文的面试题

    多线程和并发: Java支持多线程编程,允许同时执行多个任务。Java中的并发编程机制包括线程、同步、锁等,以及java.util.concurrent包提供的高级并发功能。 异常处理: Java通过异常处理机制提供了一种结构化的错误...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

    java类的设计举例-animal

    1. 输出9只动物的全部信息,举例代表全部动物的信息,并用List集合存放所有信息。 2. 可以选择输入动物的信息来增加动物的数量,其中输入错误不能添加,并且进行了异常处理。 3. 可以对动物的属性进行比较,例如年龄...

    Java开发技术大全(500个源代码).

    mulThread.java 创建多个线程对象的类 demoJoin.java 演示使用join()以确保主线程最后结束 clicker.java 一个计数用的线程类 demoPri.java 调用上面这个类设置线程优先级示例 myThread.java 自己定义的一个...

    JAVA核心知识点整理.zip

    JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。 3. JAVA 集合 集合类存放于 ...

Global site tag (gtag.js) - Google Analytics