Wait-Notify-synchronized создает замыкание
Первый поток определяет количество пробелов в файле, если количество пробелов четное - второй поток делает первые буквы всех слов в файле заглавными, если нечетные - последние буквы. С ожиданием и уведомлением. Что-то не так с функцией ожидания и уведомления, создает замыкание и не работает.
public class Dispatcher {
public static void main(String[] args) {
FileHandler fileHandler = new FileHandler();
Thread thread = new CountSpaces(new File("text.txt"), fileHandler);
Thread thread1 = new ChangeText(new File("text.txt"), fileHandler);
thread.start();
thread1.start();
}
}
class CountSpaces extends Thread{
File file;
FileHandler fileHandler;
public CountSpaces(File file, FileHandler fileHandler) {
this.file = file;
this.fileHandler = fileHandler;
}
@Override
public void run() {
fileHandler.countSpace(file);
}
}
class ChangeText extends Thread {
File file;
FileHandler fileHandler;
public ChangeText(File file, FileHandler fileHandler) {
this.file = file;
this.fileHandler = fileHandler;
}
@Override
public void run() {
try {
fileHandler.changeLetters(file);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class FileHandler {
boolean flag = false;
int count;
void countSpace(File file) {
try (Scanner sc = new Scanner(file)) {
synchronized (this){
wait();
while (sc.hasNext() && !flag) {
count++;
sc.next();
}
flag = true;
notify();
}
} catch (Exception e) {
e.printStackTrace();
}
}
void changeLetters(File file) throws InterruptedException {
try (Scanner sc = new Scanner(file);
PrintWriter printWriter = new PrintWriter(file + "result")) {
synchronized (this){
wait();
if (count % 2 == 0) {
while (sc.hasNext() && flag) {
String word = sc.next();
printWriter.print(word.substring(0, 1).toUpperCase() + word.substring(1));
}
} else {
while (sc.hasNext() && flag) {
String word = sc.next();
printWriter.print(word.substring(1, word.length() - 1)
+ word.substring(word.length() - 1).toUpperCase());
}
}
flag = false;
notify();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}