尝试用java批量下载P站周榜,结果一个线程太慢了,线程多了又怕卡,写死又不值得,于是想有了办法。
使用的是fastjson.
下面是代码段:
JSONArray tempJson = new JSONArray();
logger.info("获取启动下载线程数量:"+ThreadNum);
System.out.println("分组数量:"+length / ThreadNum);
for (int i=0; i<ThreadNum; i++){
JSONObject temp = new JSONObject();
for (int j=(length / ThreadNum) * i; j< (((length / ThreadNum)*(i+2)>length) ? length: (length / ThreadNum)*(i+1)); j++){
JSONObject tt = pics.getJSONObject(j);
temp.put(tt.getString("pid"), tt.getString(qualify));
}
tempJson.add(temp);
}
其主要部分为内层循环的三目运算。
tempJson是放置全部下载切片的数组;
ThreadNum是用户指定的需要打开的线程数量;
pics为全部图片数据的数组(盘子里的披萨);
for循环判断条件:
- 外层for:
为每个子线程分配任务(切披萨的刀);
- 内层for:
每次循环的起点均为上次分割的终点序号,当循环为最后一次时,将剩下的所有元素放入子线程任务队列;
效果:
这里以用户指定3个线程下载为例:
如图所示,22个图片被平均分为了3组(ThreadNum = 3),分别为7,7,8,其中,最后一组被塞入了前两组分完后剩下的一组(无论最后一块披萨多大,都是3线程的)。
这么做之后,下载速度大大提高,200高清图使用10线程下载仅仅不过几分钟,充分利用带宽。
然后我挂了一会下了以相当快的速度下载完了一整年的周榜图。