我现在有一个大概5万条数据的文件,每条数据有一个地址名称,我想调用百度地图API,利用发送HTTP请求的方式获得这些地址的经纬度。
        由于数据量较大,所以就想利用线程池的方法进行请求,然后我先去读文件,每读入一行文件执行一个ThreadPoolExecutor的 execute()方法,传入要读取的地址名,然后其对应的runnable中实现发送http请求的方法。因为数据量比较大,所以将线程池中的阻塞队列开到6万。不知道这样做合适吗?我对线程池之前都不是很了解,或者有什么更好的方法?
        

解决方案 »

  1.   

    这个应用里面,最大的开销是在网络上,而你的数据又比较大,你可以分析下你的数据特性,如果重复比较多,建议先做一次排序(选择合适的方法,能做到nlgn时间复杂度),然后再去发网络申请。
    开线程池的想法可行,得查一下百度API允许你调用的频度,然后,以大约两倍频度设置线程池大小。要合理使用监管线程,保证出现空闲线程时,及时调度新的任务。
      

  2.   

    恩恩,这些数据已经对重复地址进行去重了。
    然后线程池我是每读入一条数据就开一个任务。
    while(null!=(line=br.readLine())){
       threadPool.execute(new ThreadPoolTask(httpUrl,temps[0],writer,lock));
    }
    其中lock是传入的锁,保证写是异步,但是不知道为什么写到4万多条时程序还是在运行,threadPool.isTerminated()返回结果一直是false,一直不往下执行。
    我线程池是这么开的:
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8,10,30,  
                    TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000),  
                    new ThreadPoolExecutor.DiscardOldestPolicy());
      

  3.   

    度新的任务。恩恩,这些数据已经对重复地址进行去重了。
    然后线程池我是每读入一条数据就开一个任务。
    while(null!=(line=br.readLine())){
       threadPool.execute(new ThreadPoolTask(httpUrl,temps[0],writer,lock));
    }
    其中lock是传入的锁,保证写是异步,但是不知道为什么写到4万多条时程序还是在运行,threadPool.isTerminated()返回结果一直是false,一直不往下执行。
    我线程池是这么开的:
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8,10,30,  
                    TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000),  
                    new ThreadPoolExecutor.DiscardOldestPolicy());
    不知道这样可以吗