昨天发了一个提问,启动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
分享到:
相关推荐
然而,List并未设计为线程安全的容器,这意味着在多个线程同时访问和修改List时,可能会引发数据竞争和不一致的情况。标题中提到的“List添加对象的误区”主要体现在多线程环境下对List<T>.Add()方法的并发调用。 ...
Java多线程处理List数据是指使用多个线程来处理List数据的操作。这种操作可以将List数据分配给多个线程,每个线程处理一部分数据,从而提高程序的执行效率。 二、为什么需要Java多线程处理List数据? 在处理大规模...
这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程安全集合类,它们是专门为多线程环境设计的。 首先,我们要了解什么是线程安全。线程...
`CountDownLatch`是Java并发包(java.util.concurrent)中的一个计数器类,它允许一个或多个线程等待其他线程完成操作。在初始化时,`CountDownLatch`需要一个非负整数作为计数器的初始值。每次调用`countDown()`...
例如,在多个线程同时尝试修改列表时,可能会抛出`ConcurrentModificationException`。 2. `LinkedList`:与`ArrayList`类似,其迭代器也不是线程安全的,因此并发修改会导致异常。 3. `HashMap`:并发写入可能导致...
集合是Java提供的一种数据结构,用于存储多个对象。Java集合框架包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。理解这些接口和类的特性和用法是Java开发者必备的基础...
- **线程** 是程序执行流的基本单元,一个程序至少有一个线程(主线程)。 - **多线程** 允许程序同时执行多个任务,提高应用程序的性能和响应性。 **2. 委托:** - **定义**:C# 中的委托是一种引用类型数据,...
- **synchronized关键字**:可以用于修饰方法或代码块,当多个线程试图访问同一个对象的同步方法或同步代码块时,只有一个线程可以进入该方法或代码块。 - **ReentrantLock**:是一个可重入的互斥锁,提供了与...
多线程是程序设计中的一个概念,它允许多个任务在单个程序中同时执行。在计算机系统中,每个线程都是独立的执行单元,有自己的程序计数器、系统寄存器以及栈。通过多线程,可以充分利用多核处理器的计算能力,提高...
splitList()方法通过计算页数和页码的方式来将大列表分割成若干小列表,这里使用了整除和加1操作来确保每个用户都能被分配到一个线程。 每个子列表随后被封装到UserThread对象中,后者是一个实现了Runnable接口的类...
在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....
将一个比较大的list分割为多个小的list,可以解决mybatis批量插⼊数据list超过⼀定长度时报错的解决办法
在IT领域,集合比较是一...通过理解并熟练运用这些方法,我们可以有效地比较和操作两个List集合,无论是查找新增、编辑还是删除的元素。在实际项目中,这种能力对于数据同步、日志分析、版本控制等多个场景都至关重要。
这两类都要使用到IO多路复用,O多路复用是指单个进程/线程就可以同时处理多个IO请求。有三个方式select、poll、epoll。 select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间...
这里使用`Executors.newFixedThreadPool(threadNum)`创建了一个固定大小的线程池,线程池的大小为5,这意味着最多同时有5个线程执行任务。 3. **Fork/Join框架**:虽然代码中没有直接使用Fork/Join框架,但`...
- **线程概念**:线程是程序中的执行单元,一个进程中可以有多个线程同时执行。 - **创建线程**:Java提供两种方式创建线程,通过实现Runnable接口或继承Thread类。 - **线程状态**:线程有新建、就绪、运行、...
3. **线程操作**:在每个线程内部,我们可以使用内置的排序方法(如Array.Sort或List<T>.Sort)对分配的数据子集进行排序。 4. **线程同步**:为了确保所有线程完成排序后能将结果合并,我们需要使用同步机制。这...
Java List集合是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,主要用于存储一组有序的、可重复的对象。List接口提供了许多方法,使得在处理列表数据时具有很高的灵活性和效率。在这个“Java List...
基于Java实现的forkjoin... 比如有一个List类型的集合list,需要需要对list中的每个元素进行处理,然后返回处理以后的结果,但是由于list的size太大,处理速度慢,需要将list进行并行化处理,并将结果汇总,就可以使用
1. **服务器端**:负责接受来自多个客户端的连接请求,并为每个客户端创建一个独立的处理线程。 2. **客户端**:用于向服务器发送消息以及接收其他客户端发送的消息。 #### 三、关键技术点 ##### 1. 服务器端实现 ...