当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

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

发表于: 2014-04-03   作者:362217990   来源:转载   浏览:
摘要:   昨天发了一个提问,启动5个线程将一个List中的内容,然后将5个线程的内容拼接起来,由于时间比较急迫,自己就写了一个Demo,希望对菜鸟有参考意义。。 import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; public c
  昨天发了一个提问,启动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


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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一. 一个.py文件批量执行测试用例(一个.py文件下多个用例执行) 如果直接使用:unittest.main(),则
参考了开源软件code。在自己机器上测试通过。 import java.io.File; import java.io.FileNotFoundEx
3、List集合 List集合为列表类型,列表的主要特征是存放其中的对象以线性方式存储,没有特定的顺序
心法领悟057:更高级的List<T>泛型集合 List<T>泛型集合表示可通过索引访问的对象的强
心法领悟057:更高级的List<T>泛型集合 List<T>泛型集合表示可通过索引访问的对象的强
3、List集合 List集合为列表类型,列表的主要特征是存放其中的对象以线性方式存储,没有特定的顺序,
1.什么是Lsit集合? List集合是一种元素有序的,可重复的集合,集合中每个元素都有自己的元素索引。
在进行文本处理时,经常会遇到对大文件进行集合运算的情况,比如找出两个文件不同的行数据。用命令
在进行文本处理时,经常会遇到对大文件进行集合运算的情况,比如找出两个文件不同的行数据。用命令
List集合为列表类型,列表的主要特征是存放其中的对象以线性方式存储,没有特定的顺序,只有一个开
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号