关于多线程下载时计算数据块大小、下载起始位置、结束位置的理解

首先,来一些假设:

1、假设数据总大小为len。

2、假设使用线程个数THREADSUM = 3;

3、blockSize:单个线程下载的数据块大小; startIndex:单个线程下载的起始位置; endIndex:单个线程下载的终止位置

---------------------------------------------------------------------------------------------

//计算单个线程下载的数据块大小

int blockSize = len / THREADSUM;

//有些代码中这里用一个二元目来判断,len % THREADSUM ? (len / THREADSUM) : (len / THREADSUM + 1);

其实个人觉得不需要这么麻烦,直接用“总大小”/“线程个数”,就可以得出来每个线程得到的数据块大小,然后int是取整舍去小数点的(没有四舍五入),这样的话

实际上:THREADSUM * blockSize < len

然并卵,我们算在后面判断线程终止位置的时候只要将最后一个线程的终止位置=len即可。

开始计算:

int len;
int blockSize = len /THREADSUM;
for(int threadId = 0; threadId < THREADSUM; threadId++) {

  startIndex = threadId * blockSize;
      endIndex = (threadId + 1) * blockSize - 1; //最后的减1是为了让第一个线程的结束位置与第二个线程的开始位置区分开来
     //判断是否是最后一个线程   
      if(threadId == THREADSUM-1){
            endIndex = len;
        }    
}

这样就万无一失啦,求指正。

转载于:https://www.cnblogs.com/qingriye/p/4798816.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值