我写了一个站内搜索引擎,在对数据抓取的时候,由于速度问题采用了多线程,在用多线程去抓取数据的时候是一点问题也没有(每个线程下载的数据记录到一个文件系统内,200个线程生成200个文件系统,最后合并文件系统),后来我觉的用线程池比较好,就研究了一下,修改了程序,每次创建50个线程池,再创建200个线程去由50个线程池分批完成(每个线程池内的线程对应一个文件系统,也就是一共就创建50个文件系统)但在抓取完数据以后发现 数据就乱套了,url和提取的页面内容大部分还是正确的,但少部分就是乱套的了!(乱套的都是在一个线程池内完成的任务,并且是线程池内任务交接时新任务的第一个出错)
// 建立一个容量为poolsize的固定尺寸的线程池
ExecutorService executor = Executors.newFixedThreadPool(poolsize);
// 判断可是线程池可以结束
for (int i = 1; i <= threadsize; i++) {
try {
//防止线程池的并发请求挂掉sql
Thread.currentThread().sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Runnable runner = new ExecutorThread(i,dbname);
executor.execute(runner);
}
try {
executor.shutdown();
executor.awaitTermination(2000, TimeUnit.MILLISECONDS);
}catch(InterruptedException ignored){
ignored.printStackTrace();
}
}