我想找到二维数组的最大值。我没有使用多线程就找到了这个值。如何使用多线程查找二维数组的最大值?我想比较以不同方式找到数组最大值的速度。
public class Search {
public int[][] fillMatrix(int matrix[][]) {
for (int i = 0; i < matrix.length; i++){
for (int j = 0; j < matrix[i].length; j++){
matrix[i][j] = (int)(Math.random() * 1000);
}
}
return matrix;
}
public int searchMaxValue(int[][] matrix, int row, int column) {
int max = matrix[0][0];
for (int a = 0; a < row; a++) {
for (int b = 0; b < column; b++) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (matrix[a][b] > max) {
max = matrix[a][b];
}
}
}
return max;
}
public static void main(String[] args) {
Search search = new Search();
int[][] matrix = new int[4][100];
search.fillMatrix(matrix);
long start = System.currentTimeMillis();
int max = search.searchMaxValue(matrix, 4, 100);
long end = System.currentTimeMillis();
System.out.println("Max value is " + max);
System.out.println("Time for execution: " + (end - start));
}
}
答案 0 :(得分:1)
最简单的方法是启动一个线程来计算矩阵中四行中每一行的最大值,让主线程连接所有这些行线程并计算四行最大值的最大值。但是,您可能需要一个更大的阵列才能看到时差。不要忽视必要的同步。
如果我怀疑您正在寻找代码,那么您应该尝试解决方案并运行它,然后重新发布或详细说明您遇到的问题。
答案 1 :(得分:1)
以下是如何在java 8中执行此操作:
int[][] values = fillMatrix(new int[1000][1000]);
OptionalInt max = Arrays.stream(values)
.parallel()
.flatMapToInt(Arrays::stream)
.parallel()
.max();
但坦率地说,我不确定这样简单的计算是否有意义使用多个线程,实际上创建和编排线程的价格在这种情况下似乎太高了。
响应更新
由于这是你的功课,我提供的答案没有任何意见,以确保你至少会考虑它是如何工作的,但主要的想法是为每个线程提供大量数据,以避免碰撞下:
int[][] matrix = fillMatrix(new int[100][100]);
int totalThreads = 10;
int[] results = new int[totalThreads];
int chunkSize = matrix.length / totalThreads;
CountDownLatch end = new CountDownLatch(totalThreads);
for (int i = 0; i < totalThreads; i++) {
int threadIndex = i;
new Thread(
() -> {
int max = -1;
int startIndex = threadIndex * chunkSize;
for (int j = startIndex; j < startIndex + chunkSize && j < matrix.length; j++) {
for (int k = 0; k < matrix[j].length; k++) {
if (max == -1 || max < matrix[j][k]) {
max = matrix[j][k];
}
}
}
results[threadIndex] = max;
end.countDown();
}
).start();
}
end.await();
int max = results[0];
for (int k = 1; k < results.length; k++) {
if (max < results[k]) {
max = results[k];
}
}
System.out.printf("Max found %d%n", max);
答案 2 :(得分:1)
以下是您将如何实施此功能的概述。我不是故意提供代码,所以你可以自己实现它的快乐。
创建一个从数组中找到max的方法,然后调用它
findMax(int[] input)
表示2D数组中的每个子数组(可以使用
matrix[i]
访问)
开始一个线程findMax(matrix[i])
(提示:使用ExecutorService
) 在线程中,一旦找到最大值,将其填入i
位置 在线程中称为results
的一维数组,表示 完成(提示:使用CountDownLatch
)在主线程中,等待所有线程完成(提示:使用
CountDownLatch
)现在拨打findMax(results)
,你就可以了 来自矩阵的最大值。
注意事项:我们是否需要分叉与矩阵中的行一样多的线程?那么我们使用行数为FixedThreadPool
吗?