Wait-Notify получилась однопоточность

Первый поток определяет количество пробелов в файле; если количество пробелов четное, второй поток делает первые буквы всех слов в файле заглавными, если нечетные - последние буквы. С применением wait и notify.

Почему получилась однопоточность?

public class Dispatcher {
    
    public static void main(String[] args) {
        FileChanger[] fileChanger = {
                new FileChanger(new File("text.txt")),
                new FileChanger(new File("text2.txt")),
                new FileChanger(new File("text3.txt"))
        };
    
        new CountSpaces(fileChanger).start();
        new ChangeText(fileChanger).start();
    }
}
class CountSpaces extends Thread{
    FileChanger[] fileChanger;
    
    public CountSpaces(FileChanger[] fileHandlers) {
        this.fileChanger = fileHandlers;
    }
    
    @Override
    public void run() {
        for (FileChanger fileChanger : fileChanger) {
            fileChanger.countSpace();
        }
    }
}
class ChangeText extends Thread {
    FileChanger[] fileChanger;
    
    public ChangeText(FileChanger[] fileHandlers) {
        this.fileChanger = fileHandlers;
    }
    
    @Override
    public void run() {
        for (FileChanger fileChanger : fileChanger) {
            try {
                fileChanger.changeLetters();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class FileChanger {
    boolean valueSet = true;
    int count;
    File file;
    
    public FileChanger(File file) {
        this.file = file;
    }
    
    synchronized void countSpace() {
        while (!valueSet) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try (Scanner sc = new Scanner(file)) {
            while (sc.hasNext()) {
                count++;
                sc.next();
            }
            valueSet = false;
            notify();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    synchronized void changeLetters() throws InterruptedException {
        while (valueSet) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try (Scanner sc = new Scanner(file);
             PrintWriter printWriter = new PrintWriter(file + "result")) {
    
            if ((count - 1) % 2 == 0) {
                while (sc.hasNext()) {
                    String word = sc.next();

                    printWriter.print(word.substring(0, 1).toUpperCase() 
                    + word.substring(1) + " ");
                }
            } else {
                while (sc.hasNext()) {
                    String word = sc.next();
                    printWriter.print(word.substring(0, word.length() - 1)
                    + word.substring(word.length() - 1).toUpperCase() + " ");
                }
            }
            valueSet = false;
            notify();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ответы (1 шт):

Автор решения: Alex Rudenko

Проблема не обнаружена.

Добавив логирование в методы FileChanger::countSpace, FileChanger::changeLetters и запустив программу, получил такой вывод:

Thread-0:: countSpace text.txt: started
Thread-0:: countSpace text.txt: scanning started
Thread-0:: countSpace text.txt: done, count = 11
Thread-0:: countSpace text2.txt: started
Thread-0:: countSpace text2.txt: scanning started
Thread-1:: changeLetters text.txt: started
Thread-0:: countSpace text2.txt: done, count = 4
Thread-0:: countSpace text3.txt: started
Thread-0:: countSpace text3.txt: scanning started
Thread-1:: changeLetters scanning text.txt: and printing
Thread-0:: countSpace text3.txt: done, count = 7
Thread-1:: changeLetters in text.txt done
Thread-1:: changeLetters text2.txt: started
Thread-1:: changeLetters scanning text2.txt: and printing
Thread-1:: changeLetters in text2.txt done
Thread-1:: changeLetters text3.txt: started
Thread-1:: changeLetters scanning text3.txt: and printing
Thread-1:: changeLetters in text3.txt done

Process finished with exit code 0
→ Ссылка