Java 多线程处理亿万级数据

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

4个回答

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

这么写可行不?
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);  
 }  

}  

}

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐