Java многопоточность, требующая правильной работы оператора PRINT - PullRequest
0 голосов
/ 30 апреля 2020

Я немного читал об этой конкретной c проблеме, но у меня все еще проблемы с ее пониманием. Я сделал код немного грязным, пытаясь исправить его в довольно неопрятном и неорганизованном состоянии.

Для моей программы я использую многопоточность для анализа массива файлов, где каждый поток принимает объект класса (это) и определенное количество файлов из глобальной переменной File[]. Указанный подраздел c массива, а также количество файлов, которые принимает каждый поток, разделены в методе main, поэтому «общего доступа» не существует. Метод run запускает метод, который циклически просматривает каждый файл подраздела потока в переменной File, и для каждого файла он создает Map<String, Integer>. После обработки он добавляет карту в другую глобальную переменную, List<Map<String, Integer>>. Кроме того, он добавляет слова текстового файла в глобальную переменную String[].

Так что, хотя мой метод просматривает каждый индекс File[], не каждый Map добавляется к List глобальная переменная. Однако, если я добавлю оператор System.print прямо перед строкой, которая добавляет карту в глобальный список, то это сработает.

Поэтому, если я читаю 1000 файлов, некоторые файлы случайным образом пропущено и, возможно, только 989 или 994 файла будут добавлены в список хэш-карт. Однако добавление этого оператора печати гарантирует, что все 1000 файлов находятся там. Я добавил volatile к этим общим переменным, но это не решает проблему.

Это потому, что они имеют общий доступ к глобальной переменной List<Map<String, Integer>> и String[]? Как я могу исправить эту проблему, не жертвуя многопоточностью?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...