多线程并发快速处理数据

方案一:

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

}
时间: 2024-12-02 13:29:16

多线程并发快速处理数据的相关文章

请问各位牛人大侠,用离线浏览器抓取有网站限制多线程快速抓数据的网站该用那些软件

问题描述 本人工作需要,下在一个网站完整的镜象离线浏览,所以用离线浏览器teleportpro抓取一个网站,结果遇到了棘手问题,该抓取网站有限制多线程快速抓数据的设置,结果抓取了一堆请稍候......的页面,请问该用那些软件下,或者teleportpro遇到这种网站该如何设置?补充一点若我发错地方请牛人大侠跟贴告知一下这样的问题去那里问比较好,谢谢了.

解决Java多线程并发的计数器问题

问题描述 解决Java多线程并发的计数器问题 3C public class Counter { public static int count = 0; public synchronized static void inc() { count++; } public static void main(String[] args) { //同时启动1000个线程,去进行i++计算,看看实际结果 for (int i = 0; i < 1000; i++) { new Thread(new Ru

Linux下基于socket多线程并发通信的实现

pthread_server.c /*************************************************** * 文件名:pthread_server.c * 文件描述:创建子线程来接收客户端的数据 ***************************************************/ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #in

银行取款[多线程]{未进行线程同步}(junit不适合多线程并发单元测试)

        由于计算机多任务.多进程.多线程的支持,使得计算机资源的服务效率提高,服务器对请求的也使用线程来相应,所有,代码中涉及到同时对共享数据的操作,将在 多线程环境中操作数据,导致数据安全问题.      经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题.      如果要保证多线程下数据安全,就要实现线程同步(例如:一间小厕所,就得有一个锁,保证同一时间为一个人服务).其他文章讲: 此处用多线程实现,同时取款的模拟实现,未进行线程同步

单元性能测试之使用JUnitPerf测试多线程并发

简介: 单元测试和性能测试在测试领域属于要求相对较高的测试活动,也是测试工程师成长.向上发展的反向.单元测试评测我们的代码实现功能的情况,性能测试则企图分析应用程序的性能表现和负载能力.那么"单元性能测试"能做什么?我们可以这样说,单元性能测试以单元测试的形式对代码进行性能测试.单元性能测试像单元测试一样,需要测试人员编写测试代码,但现在关注的不是代码的功能实现情况了,而是想得到被测试代码的性能数据,包括执行方法耗时.多线程并发是否线程安全.内存是否泄漏.是否存在短期循环对象等.单元性

java 关于类似售票系统的多线程并发 的问题

问题描述 java 关于类似售票系统的多线程并发 的问题 本人对多进程和多线程不大了解,还请各位高手解答下,先谢了.问题如下: 1.多线程的并发,我查了下资料,一般解释的是:一个进程可以包含多个线程,一个线程完成一个功能,这样,进程执行的时候,它包含的多个线程可以看成同时执行. 那多线程的并发,可不可以有另外的理解:如果这时的某个进程只有一个线程,那么,同时有多个类似的进程同时启动,这时是不是就产生了多个进程下要同时完成相同任务的多个线程,这算不算多线程的并发? 下面拿售票系统举例说明下, 2.

oncurrent ash ap-log4j日志存入数据库的多线程并发问题

问题描述 log4j日志存入数据库的多线程并发问题 我使用Mina框架来接收多线程的数据,当我想取得创建时间(从sessionCreated()方法获得).session的上下文信息(从messageReceived()方法获得)以及断开时间(从sessionClosed()方法获得)的时候,我使用log4j的MDC来输出到数据库.可是问题来了,因为要取得断开时间,必须得第一个线程断开后触发sessionClosed()方法取得断开时间后才能将第一个线程的所有信息才会存入到数据库:但是当第一个线

【Python之旅】第五篇(三):Python Socket多线程并发

 前面的几个例子都是单线程的,下面再来说说多线程的. 1.多线程模块     主要是socketserver模块,如下图示: 2.多线程原理     如下图示说明: 3.SockteServer例子说明 服务器端: 客户端: 4.演示     还是以前面例子,对代码进行修改,作如下的演示. Server端: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import SocketServer            #导入SocketServer,

spring mvc-SpringMVC 多线程并发

问题描述 SpringMVC 多线程并发 SpringMVC的Controller默认是单例的,我现在由一个最大的疑问就是多线程并发的时候,我们如何保证的数据安全性呢.由于Controller默认是单例的,Controller中的方法也是单例的,我们如何保证一个user不会被另外一个User覆盖呢???求大神帮忙了.就像上面这个保存用户的操作,两个请求同时过来,一个user会不会被另外一个user覆盖呢???我百度说,只要不在Controller定义属性就不会安全问题啊????来个大神帮忙理理思