如果有10亿数据要处理,利用分页处理,用线程池处理,如果每个线程处理5000条,开50个线程也不够用啊。
如果无限制开线cpu肯定承受不住,对于这种要怎么处理?
分布式,把数据再分到多台机器上处理。大数据就是这么处理的
分布式 把任务都分配到不同的服务器 不过分布式肯定也还不够 再做集群 不够就加服务器就行了
http://blog.csdn.net/startupmount/article/details/39480449
这么写可行不?
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);
}
}
}