我有一个简单的问题:给定一个数字数组,找到数组的 N 个最大数字,但我需要使用多线程来解决这个问题,比如使用 10 个线程。我不想对数组进行排序:只需遍历它,并将每个元素与大小为 N 的结果数组的最小值进行比较(用 初始化Double.MIN_VALUE)。遍历数组后,结果数组将包含我输入数组的最大 N 个元素。
对于多线程,我不希望每个线程都有一个结果数组,这样我以后就不必合并它们。这就是为什么我希望所有线程都对共享结果数组进行操作。我意识到这不是最好的解决方案,但我仍然想了解我应该如何实现它。我试过这个,但它不起作用:
public class Problem {
private static final int MY_THREADS = 10;
public static void main(String[] args) {
double[] array = {...};
double[] maximums = new double[3];
for (int i = 0; i < maximums.length; ++i) {
maximums[i] = Double.MIN_VALUE;
}
ExecutorService executor = Executors.newFixedThreadPool(MY_THREADS);
Runnable worker = new MyRunnable(array, maximums);
executor.execute(worker);
executor.shutdown();
while (!executor.isTerminated()) {
}
System.out.println(Arrays.toString(maximums));
}
public static class MyRunnable implements Runnable {
private double[] array;
private double[] maximums;
MyRunnable(double[] array, double[] maximums) {
this.array = array;
this.maximums = maximums;
}
@Override
public void run() {
int i = 0;
while (i < array.length) {
if (array[i] > maximums[getMinIndex(maximums)]) {
maximums[getMinIndex(maximums)] = array[i];
}
++i;
}
}
}
private static int getMinIndex(double[] array) {
int minIndex = -1;
double min = Double.MAX_VALUE;
for (int i = 0; i < array.length; ++i) {
if (array[i] < min) {
min = array[i];
minIndex = i;
}
}
return minIndex;
}
}
有人可以帮忙吗?谢谢。
泛舟湖上清波郎朗
相关分类