0

我有以下代码

    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 循环来做到这一点?

谢谢你。

4

4 回答 4

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;
    }
}
于 2013-07-29T18:31:18.990 回答
1

我认为它正在四舍五入,尝试使用天花板。

于 2013-07-29T18:18:24.667 回答
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);
}
于 2013-07-29T18:19:33.187 回答
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;
于 2013-07-29T18:27:50.397 回答