Для каждого файла создай нить ReadThread и запусти ее == false
А следующий пункт - после запуска каждая нить ReadThread должна создать свой поток для чтения из файла == true
Не понял двух вещей - что не устраивает во 2 пункте.
И как может существовать следующая ситуация - нить запущена и создала свой поток записи, но не создана (пункты 2 и 3 валидатора)?
Если изменить ввод имен (строки 16-22) на
while (true){
String fileName = reader.readLine();
if (fileName.equals("exit")){
break;
}
ReadThread thread = new ReadThread(fileName);
thread.start();
}
то валидатор говорит, что все нормально.
Может быть валидатор стоит поправить?package com.javarush.task.task18.task1823;
import java.io.*;
import java.util.*;
/*
Нити и байты
*/
public class Solution {
public static Map<String, Integer> resultMap = new HashMap<String, Integer>();
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader.readLine();
while (!fileName.equals("exit")) {
ReadThread readThread = new ReadThread(fileName);
readThread.run();
fileName = reader.readLine();
}
// Выводим resultMap
for (Map.Entry<String, Integer> el : resultMap.entrySet()) {
System.out.println(el.getKey() + " " + el.getValue());
}
reader.close();
}
public static class ReadThread extends Thread {
String fileName;
public ReadThread(String fileName) {
this.fileName = fileName;
}
@Override
public synchronized void run() {
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> listOfRepeats = new ArrayList<>();
TreeMap<Integer, Integer> tmpMap = new TreeMap<>();
try {
// Заполняем list из файла побайтово
FileInputStream fis = new FileInputStream(fileName);
while (fis.available() > 0) {
list.add(fis.read());
}
fis.close();
// Сортируем по возрастанию наш list для
// для подсчета повторений
Collections.sort(list);
// Заполняем tmpMap парами байт-повторы
int count = 1;
for (int i = 1; i < list.size(); i++) {
if (list.get(i - 1) == list.get(i)) {
count++;
if ((int) i == (list.size() - 1)) {
tmpMap.put(list.get(i), count);
break;
}
} else {
tmpMap.put(list.get(i - 1), count);
count = 1;
if ((int) i == (list.size() - 1)) {
tmpMap.put(list.get(i), count);
break;
}
}
}
// Заполняем listOfRepeats повторами
for (Map.Entry<Integer, Integer> el : tmpMap.entrySet()) {
listOfRepeats.add(el.getValue());
}
// Находим максимальное значение среди повторов и заносим его в max
Collections.sort(listOfRepeats);
int max = listOfRepeats.get(listOfRepeats.size() - 1);
// Ищем первый совпадение value с максимальным
// количеством повторов среди tmpMap
for (Map.Entry<Integer, Integer> el : tmpMap.entrySet()) {
if (el.getValue()==max) resultMap.put(fileName,el.getKey());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}