编写一个多线程程序,计算一组数字的多种统计值。要求:在父线程中定义用数组定义10个整数,把最小值、最大值和平均值变量作为全局变量,创建三个单独工作线程(子线程),第一个线程求数字的平均值,第二个线程求最大值。第三个线程求最小值。当工作线程退出时,父线程将输出这些值。
java的话 你可以搜一下countdownlatch的使用。
public class ThreadTest {
public static void main(String[] args) {
int[] arr = new int[]{6,1,89,32,22,35,23,34};
ExecutorService service = Executors.newFixedThreadPool(3);
CountDownLatch latch = new CountDownLatch(3);
AtomicInteger avg = new AtomicInteger();
AtomicInteger max = new AtomicInteger();
AtomicInteger min = new AtomicInteger();
service.execute(() -> {
avg.set(avg(arr));
latch.countDown();
});
service.execute(() -> {
max.set(max(arr));
latch.countDown();
});
service.execute(() -> {
min.set(min(arr));
latch.countDown();
});
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("min=" + min.get() + ",max =" + max.get() + ",avg=" + avg.get());
}
private static int avg(int[] arr){
int sum = 0;
for (int i : arr) {
sum = sum + i;
}
return sum/arr.length;
}
private static int max(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]){
max = arr[i];
}
}
return max;
}
private static int min(int[] arr){
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (min > arr[i]){
min = arr[i];
}
}
return min;
}
}
#include <thread>
#include <stdio.h>
int minValue = 0;
int maxValue = 0;
int averageValue = 0;
void max(int a[], int size)
{
for (int i = 0; i < size; ++i)
{
if (a[i] > maxValue)
{
maxValue = a[i];
}
}
}
void min(int a[], int size)
{
minValue = INT_MAX;
for (int i = 0; i < size; ++i)
{
if (a[i] < minValue)
{
minValue = a[i];
}
}
}
void average(int a[], int size)
{
int sum = 0;
for (int i = 0; i < size; ++i)
{
sum += a[i];
}
if (size > 0)
{
averageValue = sum / size;
}
}
void main()
{
int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::thread calcMinWorkThead(min, a, 10);
std::thread calcMaxWorkThead(max, a, 10);
std::thread calcAverageWorkThead(average, a, 10);
calcMinWorkThead.join();
calcMaxWorkThead.join();
calcAverageWorkThead.join();
printf("min value:%d, max value:%d, average value:%d\n", minValue, maxValue, averageValue);
}