自定义多个线程合理分配下载

尝试用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线程下载仅仅不过几分钟,充分利用带宽。

然后我挂了一会下了以相当快的速度下载完了一整年的周榜图。

上一篇:(真本)*贾德森学院大学文凭|RIS文凭一样


下一篇:AcWing 828. 模拟栈