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