java - 使用多个线程填充静态数组
问题描述
我正在尝试使用多个线程填充静态数组。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;
}
我试图在每个线程完成输入后对数组进行排序,然后打印出第一个和最后一个,即最小值和最大值。问题是数组masterMin
和masterMax
似乎在假定之后仍然具有所有零条目通过Assigment.masterMin[thrnum-1] = searcher.min;
Searcher填充是另一个类,它实际上给了我非零值search.max
,search.max
正如预期的那样。
解决方案
正如@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()
在所有任务完成之前不会返回(通过失败或完成成功执行)。
推荐阅读
- angular6 - 是否可以在 ionic 4 中使 Tabs 可滑动?
- perl - 使用 perl 的 qx{} / `...` 运算符和参数列表
- c# - 如何通过将其与用户输入进行比较来搜索 int 数组与字符串数组
- groovy - 在 Groovy 中输入提示多维地图
- model - 如何使用模拟获得/确定该模型中的最佳组合(s,S)?
- c# - 在 Windows 10 IOT 上使用 I2C 从传感器读取问题
- r - 使用 R 进行数据集成
- python - 将数据复制到剪贴板管理器同上
- amazon-web-services - 使用 AWS Glue 加快开发周转时间
- javascript - 如何从添加到 html 页面的动态元素中获取数据?