我现在有一个大概5万条数据的文件,每条数据有一个地址名称,我想调用百度地图API,利用发送HTTP请求的方式获得这些地址的经纬度。
由于数据量较大,所以就想利用线程池的方法进行请求,然后我先去读文件,每读入一行文件执行一个ThreadPoolExecutor的 execute()方法,传入要读取的地址名,然后其对应的runnable中实现发送http请求的方法。因为数据量比较大,所以将线程池中的阻塞队列开到6万。不知道这样做合适吗?我对线程池之前都不是很了解,或者有什么更好的方法?
由于数据量较大,所以就想利用线程池的方法进行请求,然后我先去读文件,每读入一行文件执行一个ThreadPoolExecutor的 execute()方法,传入要读取的地址名,然后其对应的runnable中实现发送http请求的方法。因为数据量比较大,所以将线程池中的阻塞队列开到6万。不知道这样做合适吗?我对线程池之前都不是很了解,或者有什么更好的方法?
开线程池的想法可行,得查一下百度API允许你调用的频度,然后,以大约两倍频度设置线程池大小。要合理使用监管线程,保证出现空闲线程时,及时调度新的任务。
然后线程池我是每读入一条数据就开一个任务。
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());
然后线程池我是每读入一条数据就开一个任务。
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());
不知道这样可以吗