/
ProjectEroxa
/
MultiThreading_Sinchronized_wait_notify
Обзор
Документация
Войти
/
ProjectEroxa
/
MultiThreading_Sinchronized_wait_notify
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/Main.java
89 строк
3 KB
Evgeniy Eroshkin
first_commit
05 сен 2025, 09:08
05 сен 2025, 09:08
823b2fb
Код
Авторство
О чём код?
import java.util.*; import java.util.stream.Collectors; public class Main { public static void main(String[] args) throws InterruptedException { int sumRoutes = 1000; final Map<Integer, Integer> sizeToFreq = new HashMap<>(); List<String> routes = Collections.synchronizedList(new ArrayList<>()); // Поток для генерации маршрутов Thread generatorThread = new Thread(() -> { for (int i = 0; i < sumRoutes; i++) { String route = generateRoute("RLRFR", 100); synchronized (routes) { routes.add(route); routes.notify(); } } }); // Поток для подсчета R Thread counterThread = new Thread(() -> { for (int i = 0; i < sumRoutes; i++) { String route; synchronized (routes) { while (routes.size() <= i) { try { routes.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } } route = routes.get(i); } // Подсчет букв R int rCount = (int) route.chars() .filter(c -> c == 'R') .count(); // Обновление мапы synchronized (sizeToFreq) { sizeToFreq.put(rCount, sizeToFreq.getOrDefault(rCount, 0) + 1); } } }); generatorThread.start(); counterThread.start(); // Ждем завершения обоих потоков generatorThread.join(); counterThread.join(); // Вывод результатов if (sizeToFreq.isEmpty()) { System.out.println("Нет данных для анализа"); return; } // Находим максимальную частоту Integer maxFrequency = Collections.max(sizeToFreq.values()); // Находим ключ с максимальной частотой List<Integer> mostFrequentKeys = sizeToFreq.entrySet().stream() .filter(entry -> entry.getValue().equals(maxFrequency)) .map(Map.Entry::getKey) .toList(); System.out.println("Самое частое количество повторений " + mostFrequentKeys.get(0) + " (встретилось " + maxFrequency + " раз)"); System.out.println("Другие размеры:"); sizeToFreq.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .forEach(entry -> System.out.println(" - " + entry.getKey() + " (" + entry.getValue() + " раз)")); } public static String generateRoute(String letters, int length) { Random random = new Random(); StringBuilder route = new StringBuilder(); for (int i = 0; i < length; i++) { route.append(letters.charAt(random.nextInt(letters.length()))); } return route.toString(); } }