Проблема в том, что вы пытаетесь открыть тот же файл мгновенно.Просто чтобы дать вам представление:
// omitted
void reader() throws Exception {
// reader waits before writer notify
// writer notifies reader to wake up
synchronized (this) {
rdrblocked = true;
wait();
}
while (!new File("Demo.txt").exists() && running) {
Thread.sleep(10);
}
fin = new FileInputStream("Demo.txt");
if (fin.available() > 0) {
while ((ch = fin.read()) != -1) {
System.out.print((char) ch);
}
}
// omitted
Т.е., так как файл не существует в начале, тогда и читатель, и писатель могут получить разные дескрипторы от ОС.Заставить читателя проверить, существует ли файл, и ждать его существования, но все же ...
Однако это не является хорошим решением.Ваша цель неясна:
- Вы собираетесь непрерывно читать и записывать в файл, или это одноразовая операция?Если постоянно, то вы должны помнить
EOF
, как только читатель достигнет его, ваш дескриптор должен быть недействительным, хотя писатель может продолжить запись в файл после события EOF
читателя. - почему вы делаете это в рамках одного процесса?
Если за этим стоит реальная задача, вам нужно будет найти более сложное решение для обеспечения надежного чтения /запись из одного файла.Как RandomAccessFile
или еще.
Кроме того, если вы работаете wait()
и notify()
, тогда wait()
должно произойти до notify()
, в противном случае, если вы wait()
после данныхчитал из файла, затем писатель на самом деле notified()
, прежде чем даже читатель начал wait()
.Т.е. официант пропустит уведомления, произошедшие до wait()
звонка.