我写了一个站内搜索引擎,在对数据抓取的时候,由于速度问题采用了多线程,在用多线程去抓取数据的时候是一点问题也没有(每个线程下载的数据记录到一个文件系统内,200个线程生成200个文件系统,最后合并文件系统),后来我觉的用线程池比较好,就研究了一下,修改了程序,每次创建50个线程池,再创建200个线程去由50个线程池分批完成(每个线程池内的线程对应一个文件系统,也就是一共就创建50个文件系统)但在抓取完数据以后发现 数据就乱套了,url和提取的页面内容大部分还是正确的,但少部分就是乱套的了!(乱套的都是在一个线程池内完成的任务,并且是线程池内任务交接时新任务的第一个出错)

解决方案 »

  1.   

    public void CreatePool(int poolsize,int threadsize,String dbname,int start){

    //  建立一个容量为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();
    }
    }
      

  2.   

    问题解决了,是因为.......用的Thread.currentThread().getName() 来获取名字确定内容写入那个文件系统造成的,用自己定义的方法就没事了,具体为什么我也没搞清楚!