首页 > 解决方案 > 使用多个线程填充静态数组

问题描述

我正在尝试使用多个线程填充静态数组。https://stackoverflow.com/a/1492077/10418317join()中的建议用法似乎对线程施加了特定的顺序。如果可以的话,我希望它们并行运行,以加快整个过程的分配

    public class Assigment {

    public static int minPrime;
    public static int maxPrime;
    public static int[] masterMin = new int[10];
    public static int[] masterMax = new int[10];
    public static void main(String[] args) {
    // TODO code application logic here

    for(int i = 1; i < 11;i++){
     Thread thread = new Thread(new NumGenerator(i));
     thread.start();
     System.out.println("Thread " + i + " generating nums");

    }

    Arrays.sort(masterMin);
     Arrays.sort(masterMax);
     minPrime = masterMin[0];
     maxPrime = masterMax[9];
     System.out.println("<------------------------------>");
     System.out.println("Max Prime is " + maxPrime);
     System.out.println("Min Prime is " + minPrime);
 }

}


数字发生器

public class NumGenerator implements Runnable {
int[] numbers;
int thrnum;
public NumGenerator(int thrnum){
    this.thrnum = thrnum;
}
@Override
public void run(){
Random rand = new Random();
 numbers = new int[3000];

for(int i = 0; i<3000; i++){
    numbers[i] = rand.nextInt(899999)+1;

     }
Searcher searcher = new Searcher(numbers);
Assigment.masterMax[thrnum-1] = searcher.max;
Assigment.masterMin[thrnum-1] = searcher.min;

}


我试图在每个线程完成输入后对数组进行排序,然后打印出第一个和最后一个,即最小值和最大值。问题是数组masterMinmasterMax似乎在假定之后仍然具有所有零条目通过Assigment.masterMin[thrnum-1] = searcher.min; Searcher填充是另一个类,它实际上给了我非零值search.maxsearch.max正如预期的那样。

标签: javaarrays

解决方案


正如@jhamon 所指出的,线程尚未完成。但是@Sree 提供的方法并不理想,因为仅仅为了等待线程完成而关闭 Executor 并不是最好的方法。您可以尝试以下方法:

ExecutorService executor = Executors.newFixedThreadPool( 10 );
List<Callable<Object>> calls = new ArrayList<>();
for(int i = 1; i < 11;i++){
        calls.add(Executors.callable(new NumGenerator(i)));
    System.out.println("Thread " + i + " generating nums");
}
List<Future<Object>> futures = svc.invokeAll(calls);

invokeAll()在所有任务完成之前不会返回(通过失败或完成成功执行)。


推荐阅读