首先,来一些假设:
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; } }
这样就万无一失啦,求指正。