Java多线程分段处理List集合
解决方案:
1.List集合分段
2.动态创建线程池newFixedThreadPool
3.多线程处理数据
代码如下:
public static void main(String[] args) throws Exception {
// 开始时间
long start = System.currentTimeMillis();
// 模拟数据
List List<String> list = new ArrayList<String>();
for (int i = 1; i <= 3000; i++){
list.add(i + "");
}
// 每500条数据开启一条线程
int threadSize = 500;
// 总数据条数
int dataSize = list.size();
// 线程数
int threadNum = dataSize / threadSize + 1;
// 定义标记,过滤threadNum为整数
boolean special = dataSize % threadSize == 0;
// 创建一个线程池
ExecutorService exec = Executors.newFixedThreadPool(threadNum);
// 定义一个任务集合
List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
Callable<Integer> task = null;
List<String> cutList = null;
// 确定每条线程的数据
for (int i = 0; i < threadNum; i++) {
if (i == threadNum - 1) {
if (special) {
break;
}
cutList = list.subList(threadSize * i, dataSize);
} else {
cutList = list.subList(threadSize * i, threadSize * (i + 1));
}
// System.out.println("第" + (i + 1) + "组:" + cutList.toString());
final List<String> listStr = cutList;
task = new Callable<Integer>() {
@Override public
Integer call() throws Exception {
System.out.println(Thread.currentThread().getName() + "线程:" + listStr);
return 1;
}
};
// 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
tasks.add(task);
}
List<Future<Integer>> results = exec.invokeAll(tasks);
for (Future<Integer> future : results) {
System.out.println(future.get());
}
// 关闭线程池
exec.shutdown();
System.out.println("线程任务执行结束");
System.err.println("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
}
相关推荐
它通过分段锁机制来提高并发性能,允许多个线程同时读写不同的桶,从而在多线程环境中提供了更好的性能。 3. **ArrayList**: ArrayList是基于动态数组实现的列表,适合随机访问,因为其元素存储在连续的内存位置,...
针对线程安全问题,Java提供了ConcurrentHashMap类,它是线程安全的,并且能够有效避免在多线程环境下HashMap的扩容问题。ConcurrentHashMap通过使用分段锁(Segmentation)的方式来提高并发访问的能力,它将数据...
若程序需要在多线程环境下工作,则应考虑使用ConcurrentHashMap等线程安全的集合类。 这些知识点在面试Java开发职位时常常会问到,理解并掌握它们对于Java开发者而言至关重要。面试官可能会询问集合类的特点、性能...
在Java中,集合通常分为三大类:List、Set和Map。本知识点主要关注于Map接口的介绍和几种Map实现类的详解。 首先,Map是一个键值对集合,其中每个键映射到一个值,一个Map不能包含重复的键,每个键最多只能映射到一...
4. ConcurrentHashMap和Hashtable:ConcurrentHashMap是线程安全的Map,采用了分段锁策略,比Hashtable在多线程环境下表现更优。它在并发控制和性能之间找到了平衡,而Hashtable的全局锁会导致线程阻塞,效率低下。 ...
- 在多线程环境中,应考虑使用线程安全的集合,如`Vector`或通过外部同步机制保护`ArrayList`。 #### 二十、HashMap实现原理 - **JDK1.7与JDK1.8的区别**:JDK1.7中采用链表+数组的实现,JDK1.8引入了红黑树优化...
- **ConcurrentHashMap**:线程安全但效率高,适合多线程环境,采用分段锁策略。 - **Hashtable**:全局锁,线程安全,但可能导致整个集合操作变慢。 7. **如何避免集合类的并发修改问题?** - 使用`Collections...
在多线程环境下,Java提供了`ConcurrentHashMap`、`CopyOnWriteArrayList`等并发安全的集合实现。这些类使用了高级并发策略,如分段锁或读写锁,以确保在并发环境下的正确性和性能。 8. **泛型(Generics)** ...
大部分如`HashSet`、`ArrayList`、`HashMap`等是线程不安全的,它们在多线程环境下可能导致数据不一致。线程安全的集合类如`Vector`和`Hashtable`虽然确保线程安全,但性能较差。从Java 5开始,`java.util....
- JDK1.7:由多个Segment组成,每个Segment是一个独立的HashMap,对不同的Segment进行锁定,从而实现多线程并行访问。 - JDK1.8:不再使用Segment,而是直接在HashMap上使用CAS操作和分段锁,优化了结构,减少了...
总结来说,Java集合框架提供了多种集合接口和实现类,使得开发者可以根据具体需求选择合适的集合类来存储和处理数据。深入了解集合框架的工作原理和使用特点,对于编写高效、可维护的Java程序至关重要。
p 和 ConcurrentHashMap 的区别?...以上就是针对 Java 面试题中涉及的一些核心知识点的详细解释,涵盖了基础概念、数据结构、异常处理、多线程、内存管理等方面,这些都是 Java 开发者应该掌握的基础知识。
线程安全性是多线程环境中非常重要的一个考量因素,特别是在Java中,很多集合类默认情况下并非线程安全的。下面将介绍几种常见的线程安全性和非线程安全性集合类。 **2.1 Vector与ArrayList的比较** - **Vector**...
- **线程安全性**:`ConcurrentHashMap`相比`Hashtable`有更好的性能和可伸缩性,在多线程环境下表现更佳。 #### 十、ConcurrentHashMap线程安全的实现方式 - **JDK1.7**:使用`Segment`作为分段锁,每个`Segment`...
### Java集合容器面试题知识点详解 #### 集合容器概述 - **定义**:集合容器是一种用于存储数据的容器,其设计目的是为了提供一种统一且标准的方式来进行数据的存储和操作。 - **组成**:集合框架主要包括对外的...
Java多线程技术是Java并发编程的基础,它支持并行处理,提高了程序的执行效率。 1. **进程和线程的区别**: - 进程是操作系统资源分配的基本单位,每个进程都有独立的地址空间和其他资源。 - 线程是进程内的执行...
- **Hashtable** 线程安全,不允许null键和null值,适合多线程环境。 5. **ConcurrentHashMap和Hashtable的区别** - **ConcurrentHashMap** 提供了更好的并发性能,通过分段锁机制减少锁竞争,适用于多线程环境下...
ConcurrentHashMap是Java并发编程中的线程安全HashMap,它通过分段锁机制实现了高效并发。 6. **如何在ArrayList中实现线程安全?** 可以使用Collections.synchronizedList()将ArrayList包装为线程安全的列表,...
Vector类的设计是线程安全的,这意味着它的所有方法都被synchronized修饰,这在多线程环境中提供了安全性,但同时也带来了性能开销。而ArrayList是非线程安全的,如果在单线程环境中或者已经通过其他方式实现了同步...