实现 Java 高并发统计最多的数字

1. 流程图

下面是整个过程的流程图:

graph LR
A(开始) --> B(创建多个线程)
B --> C(每个线程随机生成数字)
C --> D(合并数字列表)
D --> E(统计数字出现次数)
E --> F(获取最多的数字)
F --> G(输出结果)
G --> H(结束)

2. 代码实现

2.1 创建多个线程

在 Java 中,可以通过创建多个线程来实现高并发。可以使用线程池来进行管理和调度。

首先,我们需要创建一个实现了 Runnable 接口的类 NumberGenerator,用于生成随机数字并将其添加到一个共享的数字列表中。代码如下:

public class NumberGenerator implements Runnable {
    
    private List<Integer> numbers;
    
    public NumberGenerator(List<Integer> numbers) {
        this.numbers = numbers;
    }
    
    @Override
    public void run() {
        // 生成随机数字并添加到列表
        int number = (int) (Math.random() * 100);
        numbers.add(number);
    }
}

2.2 合并数字列表

在多线程并发执行的过程中,每个线程会生成一些随机数字,并将其添加到一个共享的数字列表中。为了统计最多的数字,我们需要将这些列表合并成一个大的列表。

可以使用 Collections.synchronizedList 方法创建一个线程安全的 ArrayList,代码如下:

List<Integer> numbers = Collections.synchronizedList(new ArrayList<>());

2.3 统计数字出现次数

接下来,我们需要统计数字列表中每个数字出现的次数。可以使用 ConcurrentHashMap 来实现线程安全的计数器。

ConcurrentHashMap<Integer, Integer> counter = new ConcurrentHashMap<>();
for (Integer number : numbers) {
    counter.put(number, counter.getOrDefault(number, 0) + 1);
}

2.4 获取最多的数字

统计完数字出现的次数后,我们需要找出出现次数最多的数字。

首先,我们可以使用 Collections.max 方法找出出现次数最多的次数:

int maxCount = Collections.max(counter.values());

然后,我们可以使用 Map.Entry 遍历计数器,找出对应的数字:

List<Integer> mostFrequentNumbers = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : counter.entrySet()) {
    if (entry.getValue() == maxCount) {
        mostFrequentNumbers.add(entry.getKey());
    }
}

2.5 输出结果

最后,我们需要将最多的数字输出。可以使用 System.out.println 方法打印结果:

System.out.println("最多的数字是:" + mostFrequentNumbers);

3. 类图

下面是本文中提到的类的类图:

classDiagram
class NumberGenerator {
    -List<Integer> numbers
    +NumberGenerator(List<Integer> numbers)
    +run()
}

4. 完整代码

下面是完整的代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class NumberGenerator implements Runnable {
    
    private List<Integer> numbers;
    
    public NumberGenerator(List<Integer> numbers) {
        this.numbers = numbers;
    }
    
    @Override
    public void run() {
        // 生成随机数字并添加到列表
        int number = (int) (Math.random() * 100);
        numbers.add(number);
    }
}

public class Main {
    
    public static void main(String[] args) {
        // 创建数字列表
        List<Integer> numbers = Collections.synchronizedList(new ArrayList<>());
        
        // 创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        
        // 创建多个线程
        for (int i = 0; i < 10; i++) {
            executorService.execute(new NumberGenerator(numbers));
        }
        
        // 关闭线程池
        executorService.shutdown();
        
        // 等待所有线程执行完成
        try {
            executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        // 统计数字出现次数
        ConcurrentHashMap<Integer, Integer> counter = new ConcurrentHashMap<>();
        for (Integer number : numbers) {
            counter.put(number, counter.getOrDefault(number, 0) +