weixin_35756538
weixin_35756538
采纳率0%
2017-03-14 02:34 阅读 3.9k

Java 多线程处理亿万级数据

如果有10亿数据要处理,利用分页处理,用线程池处理,如果每个线程处理5000条,开50个线程也不够用啊。
如果无限制开线cpu肯定承受不住,对于这种要怎么处理?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • oyljerry oyljerry 2017-03-14 02:40

    分布式,把数据再分到多台机器上处理。大数据就是这么处理的

    点赞 评论 复制链接分享
  • m0_37573109 Mr_雨月 2017-03-14 02:46

    分布式 把任务都分配到不同的服务器 不过分布式肯定也还不够 再做集群 不够就加服务器就行了

    点赞 评论 复制链接分享
  • shen_wei shen_wei 2017-03-14 03:38
  • weixin_35756538 weixin_35756538 2017-03-14 06:03

    这么写可行不?
    import java.util.concurrent.ExecutorService;

    import java.util.concurrent.Executors;

    import java.util.concurrent.atomic.AtomicInteger;

    public class ThreadPoolExecutorDemo2 {

    //需要处理的总数据条数

    static int count = 100000000;

    //每个线程处理的数据

    static int handleCount = 5000;

    //设置线程数量

    static int handleThread = 30;

    //使用AtomicInteger实现分页,是线程安全的,避免数据重复处理。比synchronized相率相对要高

    private static AtomicInteger line = new AtomicInteger(0);

    //创建固定线程池个线程  
    static ExecutorService pool  = Executors.newFixedThreadPool(handleThread);  
    
    //每次处理5000条。  
    //0-5000  
    //5000-10000  
    //10000-15000  
    //.........  
    public static int getLine(){  
        return line.addAndGet(handleCount);  
    }  
    
    public static void doJob(){  
        //创建线程  
        for (int i = 0; i < handleThread ; i++) {  
            MyTask2 myTask = new MyTask2();  
            pool.execute(myTask);  
        }  
        //关闭线程池  
        pool.shutdown();  
    }  
    
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        //执行  
        ThreadPoolExecutorDemo2.doJob();  
    }  
    

    }

    class MyTask2 implements Runnable{

    @Override  
    public void run() {  
         System.out.println("线程:" + Thread.currentThread().getName());  
         while (true) {  
             Integer num = ThreadPoolExecutorDemo2.getLine();  
             //如果处理的数据还没处理完  
             if((num-ThreadPoolExecutorDemo2.handleCount)<ThreadPoolExecutorDemo2.count){  
                 //伪代码,实际要从数据库查询数据从多少行到多少行的数据  
                 System.out.println("处理数据"+(num-ThreadPoolExecutorDemo2.handleCount)+"到"+num);  
                 //处理完批量提交事物。如2000条提交一次。省略......  
             }else{  
                 System.out.println("运行结束");  
                 break;  
             }  
             //System.out.println("startline = " +(num-1000)+",endline = " + num);  
     }  
    
    }  
    

    }

    点赞 评论 复制链接分享

相关推荐