如何使用多线程在java中找到二维数组的最大值

时间:2016-06-05 14:36:19

标签: java arrays multithreading

我想找到二维数组的最大值。我没有使用多线程就找到了这个值。如何使用多线程查找二维数组的最大值?我想比较以不同方式找到数组最大值的速度。

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));
    }
}

3 个答案:

答案 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吗?