我一直在尝试编写一个程序来查找数组中的最大值。 我知道如何使用线程来找到它,但要得到正确的答案,我需要使用.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];
}
}
}
答案 0 :(得分:0)
您应该在Thread.join()
上使用main thread.
方法确保等待线程直到完成它的工作。否则主线程可以在线程完成之前终止。
答案 1 :(得分:0)
为什么使用synchronized
?您希望并行运行所有线程,这样可以避免它
您需要加入线程以查看它们何时完成。您调用线程的代码是另一个线程,它不知道这四个线程何时完成了它们的工作。 join()等待这一刻。
这有效,但如果我只使用.join()
&#34;工作&#34;意味着没有join()你没有正确的结果?是的,因为调用代码(你不幸地没有显示)可能会在线程起始行上运行,甚至在线程启动之前就已经结束了。
现在随着更多代码可用,它对我来说很清楚。你执行一个循环:
开始第一个线程
等待第一个帖子
开始第二个线程...
在前一个线程完成之前没有线程启动!
您需要单独的循环。首先在一个循环中启动所有线程,然后等待它们在第二个循环中完成。
答案 2 :(得分:0)
该课程可以实施comparable<arraylist>
,您可以使用Collections.max(arrayList)
方法。