方案一:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class LargSumWithCallable {
static int threadCounts =10;//使用的线程数
static long sum=0;
public static void main(String []args) throws InterruptedException, ExecutionException{
ExecutorService exec=Executors.newFixedThreadPool(threadCounts);
List<Callable<Long>> callList=new ArrayList<Callable<Long>>();
List<Integer> list = new ArrayList<Integer>();
for (int j = 0; j <= 1000000;j++) {
list.add(j);
}
int len=list.size()/threadCounts;//平均分割List
//List中的数量没有线程数多(很少存在)
if(len==0){
threadCounts=list.size();//采用一个线程处理List中的一个元素
len=list.size()/threadCounts;//重新平均分割List
}
for(int i=0;i<threadCounts;i++){
final List<Integer> subList;
if(i==threadCounts-1){
subList=list.subList(i*len,list.size());
}else{
subList=list.subList(i*len, len*(i+1)>list.size()?list.size():len*(i+1));
}
//采用匿名内部类实现
callList.add(new Callable<Long>(){
public Long call() throws Exception {
long subSum=0L;
for(Integer i:subList){
subSum+=i;
}
System.out.println("分配给线程:"+Thread.currentThread().getName()+"那一部分List的整数和为:\tSubSum:"+subSum);
return subSum;
}
});
}
List<Future<Long>> futureList=exec.invokeAll(callList);
for(Future<Long> future:futureList){
sum+=future.get();
}
exec.shutdown();
System.out.println(sum);
}
}
方案二:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class LargeListIntegerSum {
private long sum;//存放整数的和
private CyclicBarrier barrier;//障栅集合点(同步器)
private List<Integer> list;//整数集合List
private int threadCounts;//使用的线程数
public LargeListIntegerSum(List<Integer> list,int threadCounts) {
this.list=list;
this.threadCounts=threadCounts;
}
/**
* 获取List中所有整数的和
* @return
*/
public long getIntegerSum(){
ExecutorService exec=Executors.newFixedThreadPool(threadCounts);
int len=list.size()/threadCounts;//平均分割List
//List中的数量没有线程数多(很少存在)
if(len==0){
threadCounts=list.size();//采用一个线程处理List中的一个元素
len=list.size()/threadCounts;//重新平均分割List
}
barrier=new CyclicBarrier(threadCounts+1);
for(int i=0;i<threadCounts;i++){
//创建线程任务
if(i==threadCounts-1){//最后一个线程承担剩下的所有元素的计算
exec.execute(new SubIntegerSumTask(list.subList(i*len,list.size())));
}else{
exec.execute(new SubIntegerSumTask(list.subList(i*len, len*(i+1)>list.size()?list.size():len*(i+1))));
}
}
try {
barrier.await();//关键,使该线程在障栅处等待,直到所有的线程都到达障栅处
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()+":Interrupted");
} catch (BrokenBarrierException e) {
System.out.println(Thread.currentThread().getName()+":BrokenBarrier");
}
exec.shutdown();
return sum;
}
/**
* 分割计算List整数和的线程任务
*
*/
public class SubIntegerSumTask implements Runnable{
private List<Integer> subList;
public SubIntegerSumTask(List<Integer> subList) {
this.subList=subList;
}
public void run() {
long subSum=0L;
for (Integer i : subList) {
subSum += i;
}
synchronized(LargeListIntegerSum.this){//在LargeListIntegerSum对象上同步
sum+=subSum;
}
try {
barrier.await();//关键,使该线程在障栅处等待,直到所有的线程都到达障栅处
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()+":Interrupted");
} catch (BrokenBarrierException e) {
System.out.println(Thread.currentThread().getName()+":BrokenBarrier");
}
System.out.println("分配给线程:"+Thread.currentThread().getName()+"那一部分List的整数和为:\tSubSum:"+subSum);
}
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
int threadCounts = 10;//采用的线程数
for (int i = 1; i <= 1000000; i++) {
list.add(i);
}
long start= System.currentTimeMillis();
LargeListIntegerSum countListIntegerSum=new LargeListIntegerSum(list,threadCounts);
long sum=countListIntegerSum.getIntegerSum();
System.out.println("List中所有整数的和为:"+sum);
long end= System.currentTimeMillis();
System.out.println(end-start);
}
}
分享到:
相关推荐
在处理大量图像或需要快速响应时间的应用场景中,多线程并发识别可以显著提升效率。以下将详细介绍如何利用Tesseract OCR实现多线程并发识别,以及可能涉及的相关技术点。 首先,理解Tesseract OCR的基本工作原理是...
这里,我们主要探讨的是如何通过编写多线程并发程序来优化应用程序的性能,提高系统的处理能力。 首先,多线程是指在一个进程中同时执行多个线程。线程是操作系统调度的基本单位,它允许程序同时执行多个任务。多...
在计算机科学中,多线程并发处理是一种编程技术,它允许多个线程在同一时间执行,从而提升程序的效率和响应速度。特别是在现代处理器架构中,多线程并发处理是利用多核处理器资源的关键手段。以下是对给定文件中可能...
一种典型的多线程并发服务器架构如下: - **主监听线程**:负责接收客户端连接请求。 - **工作线程池**:由多个工作线程组成,负责处理具体的客户端请求。 **3. 示例代码片段** 下面是一个简单的多线程服务器示例...
在处理网络接收数据时,使用多线程可以避免因为单一线程处理数据而造成的阻塞,使得程序能够同时接收和处理来自多个源的数据包。 其次,UDP(User Datagram Protocol)是一种无连接的传输层协议,它比TCP...
在本主题中,我们关注的是易语言在实现WebSocket通信中的应用,以及多线程并发处理的稳定模块。 WebSocket是一种在互联网上进行全双工通信的协议,允许服务器和客户端实时交换数据,而无需频繁建立新的HTTP连接。这...
以下将详细介绍“C#处理大容量数据,及多线程简单应用”这一主题。 首先,当我们面临大量数据时,一个关键的考虑点是避免阻塞主线程,尤其是对于UI(用户界面)应用。在C#中,长时间运行的任务会阻塞UI线程,导致...
- **多线程并发**:再次强调了库支持多线程并发请求,这对于需要批量处理HTTP请求的场景非常有用,比如网站爬虫或数据分析。 - **并发请求库**:这表明MultiHttp是一个专门设计用于并发执行HTTP请求的工具,对于...
### 多线程并发编程在Netty中的应用分析 #### JAVA内存模型与多线程编程 ##### 1.1. 硬件的发展和多任务处理 随着硬件技术的不断进步,尤其是多核处理器的普及及其成本的降低,现代操作系统几乎都具备了支持多...
- 在多线程环境中,每个线程都应该有适当的异常处理机制,防止线程因未捕获的异常而突然终止,导致整个程序崩溃。 6. **性能优化** - 并发数量的调整:线程过多可能会增加系统开销,而过少则可能无法充分利用多核...
多线程编程作为一种提高程序并发性和性能的技术,尤其在并行处理领域展现出巨大潜力。在并行处理中,多线程能够充分利用现代多核处理器的能力,通过同时执行多个线程来加速计算过程。本文旨在探讨如何在递归算法中...
在IT领域,多线程并发是一项关键的技术,它允许程序同时执行多个任务,极大地提高了效率,尤其是在处理大量数据或执行耗时操作时。本话题聚焦于如何利用多线程技术来快速查找目录下的文件,这在系统管理和数据分析等...
采用多进程多线程技术进行数据采集处理,不仅能显著提升程序的响应速度和执行效率,还能有效解决单进程多线程设计中存在的并发处理能力不足、结构不清晰和分层次管理能力不足等问题。此外,通过将数据采集计算与分析...
适合人群:具有 C# 编程基础的开发者,特别是那些需要处理多线程并发问题的技术人员。 使用场景及目标:① 在多线程环境中,防止数据竞争和资源冲突,确保程序稳定性和一致性;② 学习不同同步机制的优缺点,选择...
在并发处理方面,多线程是一种常见的方法,特别是在Web应用中,它允许服务器同时处理多个客户端请求,提升系统效率。在Python中,由于全局解释器锁(GIL)的存在,单个进程内的多线程并不能充分利用多核处理器的优势...
5. **并发控制**:考虑到多进程多线程环境,需要理解锁、信号量等并发控制机制,以防止数据竞争问题。 通过分析这个项目,开发者可以深入学习多进程、多线程编程技巧,以及如何在实际应用中优化算法性能。此外,...
在IT行业中,Linux多线程高...以上就是关于“Linux多线程高并发服务器”相关的核心知识点,涵盖了从线程管理、并发处理、资源调度到性能优化等多个层面。理解并掌握这些知识点对于开发高可用、高性能的服务器至关重要。
### 深入Java多线程与并发编程 在当今高度发展的信息技术领域中,随着硬件技术的进步和软件架构设计的复杂化,多线程与并发编程成为提高程序执行效率、增强系统性能的关键技术之一。本篇文章将围绕Java多线程与并发...
在实时数据采集与控制中,多线程能够实现数据处理和控制指令的并发执行,确保系统的响应速度和实时性。例如,一个线程负责接收串口数据,另一个线程则负责解析数据并执行控制命令。 三、实时数据采集 实时数据采集...
### Java多线程分页查询知识点详解 ...综上所述,多线程分页查询是一种非常有效的技术手段,能够显著提升大规模数据处理时的系统性能。开发者可以根据实际应用场景灵活调整参数配置和算法逻辑,进一步优化查询效率。