多线程并发快速处理数据

简介: 方案一: import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import

方案一:

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);  
	    }  
	
}


目录
相关文章
|
2月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
206 0
|
3月前
|
消息中间件 监控 安全
服务Down机了,线程池中的数据如何保证不丢失?
在分布式系统与高并发应用开发中,服务的稳定性和数据的持久性是两个至关重要的考量点。当服务遭遇Down机时,如何确保线程池中处理的数据不丢失,是每一位开发者都需要深入思考的问题。以下,我将从几个关键方面分享如何在这种情况下保障数据的安全与完整性。
72 2
|
19天前
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
114 62
|
1月前
|
安全
List并发线程安全问题
【10月更文挑战第21天】`List` 并发线程安全问题是多线程编程中一个非常重要的问题,需要我们认真对待和处理。只有通过不断地学习和实践,我们才能更好地掌握多线程编程的技巧和方法,提高程序的性能和稳定性。
176 59
|
17天前
|
安全 Java
线程安全的艺术:确保并发程序的正确性
在多线程环境中,确保线程安全是编程中的一个核心挑战。线程安全问题可能导致数据不一致、程序崩溃甚至安全漏洞。本文将分享如何确保线程安全,探讨不同的技术策略和最佳实践。
30 6
|
21天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
43 6
|
20天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
1月前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
2月前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
50 2
|
2月前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
32 1