工作中遇到的场景,这里写个例子出来,实际应用比此处更为健壮和完善
应用场景:
对一张表10万条数据(或100万或1亿+)进行更新操作或写入操作;
菜鸟是一条一条的执行吧,这显然不行啊
我在实际项目中是这样应用的, 批量更新!当然这显然是不够的 要线程批量更新才对吧!
怎么做呢?
举例1:10万条数据 ,我1000条1000条的处理 就是,10万/1000 = 100 ,
这里我就用100个线程同时处理,每个线程负责1000条数据,这里有个关键点,处理的数据不能重复!
给个代码示例吧:
线程池中线程数量可以根据 数据量/单个线程处理数量 来计算
public classDySchedule{
private static AtomicInteger line = new AtomicInteger(0);
static ExecutorService pool = Executors.newFixedThreadPool(100);
publicstaticintgetLine(){
return line.addAndGet(1000);
}
publicstaticvoiddoJob(){
for (int i = 0;i<100;i++){
Thread thread = new MyThread();
pool.execute(thread);
}
pool.shutdown();
}
publicstaticvoidmain(String[] args){
DySchedule.doJob();
}
}
以下是每个线程要执行的内容
public classMyThreadextendsThread{
@Override
public void run() {
System.out.println("线程:" + Thread.currentThread().getName());
Integer num = DySchedule.getLine();
System.out.println("startline = " +(num-1000)+",endline = " + num);
}
}
程序运行结果:
线程:pool-1-thread-1
startline = 0,endline = 1000
线程:pool-1-thread-2
startline = 1000,endline = 2000
线程:pool-1-thread-5
线程:pool-1-thread-3
startline = 2000,endline = 3000
startline = 3000,endline = 4000
线程:pool-1-thread-4
startline = 4000,endline = 5000
线程:pool-1-thread-6
线程:pool-1-thread-7
startline = 6000,endline = 7000
startline = 5000,endline = 6000
线程:pool-1-thread-9
startline = 7000,endline = 8000
线程:pool-1-thread-8
startline = 8000,endline = 9000
线程:pool-1-thread-10
startline = 9000,endline = 10000
线程:pool-1-thread-12
startline = 10000,endline = 11000
线程:pool-1-thread-11
startline = 11000,endline = 12000
线程:pool-1-thread-16
startline = 12000,endline = 13000
线程:pool-1-thread-15
线程:pool-1-thread-19
startline = 14000,endline = 15000
startline = 13000,endline = 14000
线程:pool-1-thread-20
startline = 15000,endline = 16000
....
....
这里只把每个线程要处理的数据行数或分割号列举处理了,
比如以上
线程:pool-1-thread-1
startline = 0,endline = 1000 处理数据库0-1000行的数据
线程:pool-1-thread-2
startline = 1000,endline = 2000 处理1000-2000行的数据
接下来的批量任务内容是不是简单多了,不多少了,记住这里关键点就是保证数据不重复!,不遗漏!
这样子的思路几百万或者几千万级别的批量处理是没有什么问题的,
但是 你有几个亿或者几百亿的数据需要批量处理怎么办呢? 小伙子 别急,作为一名资深程序员当然还是有办法的
需要吧以上思路或方案设计成分布式,多任务,多线程的schedule 就可以了,