在数组中查找最大值;在Java中使用四个线程

时间:2018-05-13 15:58:31

标签: java arrays multithreading

我一直在尝试编写一个程序来查找数组中的最大值。 我知道如何使用线程来找到它,但要得到正确的答案,我需要使用.join()。

我不明白为什么在不使用.join()的情况下找不到最大值。如果我使用.join()那么程序的运行时间将与没有线程的同一程序一样多;所以,如果它是运行我的线程的唯一方法,它并没有紧固过程为什么我们使用线程?

public void run() {
    for (int i = start; i < end; i++) {
        if (array[i] > threadMax) {
            threadMax = array[i];
        }
    }        
}

这是我的跑步方法;我给每个线程四分之一的数组,然后找到它们之间的最大值。 这是有效的,但如果我只使用.join(),但我不想放慢程序。 我还可以做些什么? 编辑:这是我的代码:

    ThreadMax[] findMax = new ThreadMax[4];
    findMax[0] = new ThreadMax(array, 0,array.length/4);
    findMax[1] = new ThreadMax(array, array.length/4, (2*array.length)/4);
    findMax[2] = new ThreadMax(array, (2*array.length)/4, (3 * array.length) / 4);
    findMax[3] = new ThreadMax(array, (3 * array.length) / 4, array.length);
    for(int i = 0; i < 4; i++) {
        findMax[i].myThread.start();
        try {
            findMax[i].myThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    int[] topFour = new int[4];
    for(int i = 0; i < 4; i++)
        topFour[i] = findMax[i].threadMax;
    int result = 0;
    for(int i = 0; i < 4; i++){
        if(result < topFour[i])
            result = topFour[i];
    }
    System.out.println("Max = " + result);

和我的ThreadMax类:

int start;
int end;
int threadMax;
int[] array;
Thread myThread;

ThreadMax(int[] array, int start, int end) {

    this.array = array;
    this.start = start;
    this.end = end;

    myThread = new Thread(this);
}

@Override
public void run() {
    for (int i = start; i < end; i++) {
        if (array[i] > threadMax) {
            threadMax = array[i];
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您应该在Thread.join()上使用main thread.方法确保等待线程直到完成它的工作。否则主线程可以在线程完成之前终止。

答案 1 :(得分:0)

为什么使用synchronized?您希望并行运行所有线程,这样可以避免它 您需要加入线程以查看它们何时完成。您调用线程的代码是另一个线程,它不知道这四个线程何时完成了它们的工作。 join()等待这一刻。

  

这有效,但如果我只使用.join()

&#34;工作&#34;意味着没有join()你没有正确的结果?是的,因为调用代码(你不幸地没有显示)可能会在线程起始行上运行,甚至在线程启动之前就已经结束了。

修改

现在随着更多代码可用,它对我来说很清楚。你执行一个循环:
开始第一个线程
等待第一个帖子
开始第二个线程...

在前一个线程完成之前没有线程启动!

您需要单独的循环。首先在一个循环中启动所有线程,然后等待它们在第二个循环中完成。

答案 2 :(得分:0)

该课程可以实施comparable<arraylist>,您可以使用Collections.max(arrayList)方法。