我有以下代码
for (int k=0; k<maxThreads; k++) {
int firstpart = k * tasksPerThread;
int secondpart = ((k+1) * tasksPerThread) - 1;
System.out.println(firstpart + "," + secondpart);
}
用户输入maxThreads且tasksPerThread为10 / maxThreads。 MaxThreads永远不会小于1.这会输出数字对。例如,如果maxThreads = 2(使tasksPerThread = 5),则输出
0,4
5,9
涵盖所有十个值0-9
如果maxThreads = 4,我想要覆盖所有十个值。现在代码输出
0,1
2,3
4,5
6,7
但我希望它涵盖0-9。理想情况下,它会输出
0-2
3-5
6-7
8-9
或者实际上任何具有maxThreads数字组数且覆盖0-9的组合。如何调整for循环来执行此操作?
谢谢。
答案 0 :(得分:1)
我认为它正在向下舍入,尝试使用天花板。
答案 1 :(得分:1)
在这种情况下,您必须在tasksPerThread
变量中更多地使用一个线程。您将其计算为10/maxThreads
,但您需要对其应用上限。
int tasksPerThread = Math.ceil(10/(double) maxThreads);
请注意,您必须将maxThreads
作为双倍,因为如果将其视为int
,则div结果将始终为int
。
这应该这样做:
int tasksPerThread = Math.ceil(10/(double) maxThreads);
for (int k=0; k<maxThreads; k++) {
int firstpart = k * tasksPerThread;
int secondpart = ((k+1) * tasksPerThread) - 1;
System.out.println(firstpart + "," + secondpart);
}
答案 2 :(得分:1)
您可以执行以下操作:
for (int k = 0; k < maxThreads; k++) {
int firstpart = (int) (k * tasksPerThread);
int secondpart = (int) (((k + 1) * tasksPerThread) - 1);
System.out.println(firstpart + "," + secondpart);
}
其中tasksPerThread
计算为:
double tasksPerThread = 10.0 / maxThreads;
或等效
double tasksPerThread = 10 / (double) maxThreads;
答案 3 :(得分:1)
此代码将在maxThreads
个线程中划分n个任务:
public static void schedule(int n, int maxThreads) {
int tasksPerThread = (n + maxThreads - 1) / maxThreads;
int nExtra = tasksPerThread * maxThreads - n;
int nFull = tasksPerThread * (maxThreads - nExtra);
int start = 0;
while (start < nFull) {
int end = start + tasksPerThread - 1;
System.out.printf("%1$d,%2$d%n", start, end);
start = end + 1;
}
while (start < n) {
int end = start + tasksPerThread - 2;
System.out.printf("%1$d,%2$d%n", start, end);
start = end + 1;
}
}