有时我们处理一个耗时的运算,就必须开启线程处理,如果运算数量非常庞大,每个运算都开启一个线程,这里做了太多无用功,会造成CPU负荷
内存暴涨,尤其是移动端,内存和cpu资源是极其宝贵的,合理的做法是,智能给运算分组,每组运算交给一个线程处理。那这样一来就需要一个小算法。下面给出了算法逻辑。calculateThreadNum获得需要分配的线程数,isOpenThreadNum控制是否需要创建线程。
/**
* 计算线程个数,根据运算总数和线程单位处理数,计算线程个数
* @param totalSize 运算总数
* @param disThreadNum 每层分配线程数
* @return
*/
private int calculateThreadNum(int totalSize, int disThreadNum) {
int threadNum = 0; //线程数量
int iThread = totalSize / disThreadNum;
int mThread = totalSize % disThreadNum;
if(totalSize >= 0) {
if(mThread > 0) {
threadNum = iThread + 1;
return threadNum;
} else {
return iThread;
}
} else {
return -1; //异常,整数必须大于等于0
}
}
/**
* 动态分配线程。根据运算总数和线程单位处理数动态分配线程个数
* @param totalSize 运算总数
* @param disThreadNum 单位线程处理运算个数
* @param 运算索引数
* @return
*/
private static boolean isOpenThreadNum(int totalSize, int disThreadNum, int index) {
if(totalSize > 0) {
if(totalSize <= disThreadNum) {
if(totalSize == index) {
return true;
}
} else {
if(index < totalSize) {
if(index % disThreadNum == 0) {
return true;
}
} else if(index == totalSize) {
return true;
}
return false;
}
}
return false;
}