假设有N条记录要从数据库中读出,然后导成文件我是想到了以下两个方法,但也有些疑问
一、固定的5个线程,每个线程处理100条记录 问题是:当这5个线程处理外500条记录后,怎么办?全部WAIT()在那边,然后当新的500条记录分配下来后一个个NOTIFY,那这5个线程如何让其再次运行? 重新NEW出来5个线程,那这样JVM不是来不及释放
二、线程池,线程池和JDBC连接池一样,开5个线程,然后每个线程处理100条记录,把N条记录一起扔给这个线程池,此线程池固定处理是500条记录,其他记录排队? 问题是: 排队?排在那边,也是排在内存中啊?那我有100万条记录,就是有100万-500条记录记录排在内存中啊?我用多线程处理就是希望想分批读出记录做处理, 这样一来不是起不到效果了?请大家参与讨论
一、固定的5个线程,每个线程处理100条记录 问题是:当这5个线程处理外500条记录后,怎么办?全部WAIT()在那边,然后当新的500条记录分配下来后一个个NOTIFY,那这5个线程如何让其再次运行? 重新NEW出来5个线程,那这样JVM不是来不及释放
二、线程池,线程池和JDBC连接池一样,开5个线程,然后每个线程处理100条记录,把N条记录一起扔给这个线程池,此线程池固定处理是500条记录,其他记录排队? 问题是: 排队?排在那边,也是排在内存中啊?那我有100万条记录,就是有100万-500条记录记录排在内存中啊?我用多线程处理就是希望想分批读出记录做处理, 这样一来不是起不到效果了?请大家参与讨论
不一定要销毁线程啊,可以让它们Sleep直到有新的任务在唤醒它们啊.
按照您的意思就是,有任务来了就唤醒,是不就是说,如果我这个是一个导出数据成文件的程序,那这个进程的生命是随着我整个程序的开始而开始,结束而结束?还有,您指的让它一直SLEEP是指WAIT()还是SLEEP(),如果是SLEEP(),如何弄醒它?
启动后就运行你的记录处理逻辑,只处理获得的记录,处理完就完了,这个线程自动就会消失一个主类,取记录,取够你想拆分的数量(100条)后,
就new一个处理类,把这100条记录传给他,让他start去处理
再取100条记录,再new一个处理类,再start逻辑就应该是这样,至于说频繁生成线程销毁线程的开销,可以通过调节你的拆分数量来控制
另外,线程池也是为了优化这点而生的
但并不是说要保持住多少个线程让他wait在那里来处理,这不是一个好的业务逻辑
直接每个线程分配100W/5条就可以了啊,至于你说的有100W条在内存
记录在不在内存,取决你什么时候取出来,而不是取决于你什么时候去处理如果你不想占内存,你就每次取少部分取来处理,就像分页一样
比如
cycletime=10000;
//创建定时器
Sender.timer = new Timer(true);
//定制任务
Sender.timer.schedule(new TimerTask() {
public void run() {
new SenderThread().start();
}
}, 0, cycletime);
红色部分就是每个多少时间生成一个新的发送数据的线程,每次从队列数据库中取出100条数据进行处理,当然数据从队列出来的时候是要考虑线程安全的。
你担心的这个问题可以用System.gc();
而且最好用线程池.