【发布时间】:2021-09-22 12:43:09
【问题描述】:
我有一个简单的 Java 线程分配,它使用线程计算平均值、最大值和最小值。目前,我的所有线程都在一个类中。如何将这些线程移动到单独的“计算类”中,然后从 main 中的外部类调用线程?以下是我的代码,不胜感激!
import java.util.*;
public class Stats {
// Declaring the necessary variables.
static int x;
static int[] input;
// Array of integers to hold the maximum and minimum values when computed in the
// thread. placeHolder[0] = min placeHolder[1] = max.
static int[] placeHolder = new int[2];
static double[] averageHolder = new double[1];
public static void main(String[] args) {
// Print statements prompting user/gathering input and storing into the array.
Scanner scan = new Scanner(System.in);
System.out.println("How many numbers would you like to compute?");
x = scan.nextInt();
input = new int[x];
System.out.println("Please enter the numbers you would like computed:");
for (int i = 0; i < x; i++) {
input[i] = scan.nextInt();
}
avgThread.start();
minThread.start();
maxThread.start();
try {
avgThread.join();
minThread.join();
maxThread.join();
} catch (Exception i) {
}
System.out.printf("Avarage of Data : %f\nMinimum of Data : %d\nMaximum of Data :%d\n", averageHolder[0],
placeHolder[0], placeHolder[1]);
}
static Thread maxThread = new Thread(new Runnable() {
@Override
public void run() {
int maximum = input[0];
int i = 0;
while (i < x) {
if (maximum < input[i])
maximum = input[i];
i++;
}
placeHolder[1] = maximum;
}
});
static Thread avgThread = new Thread(new Runnable() {
@Override
public void run() {
double average = 0;
int i = 0;
while (i < x) {
average = average + input[i];
i++;
}
average = average / x;
averageHolder[0] = average;
}
});
static Thread minThread = new Thread(new Runnable() {
@Override
public void run() {
int minimum = input[0];
int i = 0;
while (i < x) {
if (minimum > input[i])
minimum = input[i];
i++;
}
placeHolder[0] = minimum;
}
});
}
【问题讨论】:
-
创建线程并保持对它们的引用与类和实例中的任何其他数据没有什么不同。您可能想要考虑制作实现
Runnable的类,并将其结果保存在内部并将输入数组作为参数。尝试先建立一个合理的结构。 -
所以你说的是创建线程。然后在 main 中声明线程,如 Thread maxThread = new Therad();?
-
将
Stats中的相关代码提取到另一个类如StatsCalculator。在main()中创建StatsCalculator的新实例并调用运行线程的StatsCalculator方法。另外,考虑返回类似StatsResult类实例来保存结果,而不是返回一个神奇的位置数组。 -
谢谢安德鲁。最后一个问题。由于我现在正在
StatsCalculator中进行计算,那么我会在该类中声明变量吗?因为扫描仪如何链接到新类?
标签: java multithreading class