Как заставить поток ждать, пока не будет создан файл?

Мне нужен поток, который подождет, пока файл не будет создан или создан. Пока у меня есть следующий код:

while(!receivedDataFile.isFileExists("receiveddata.txt"))
{
    try {
        Thead.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
        return null;
    }
}

Когда я запускаю его, появляется следующее исключение, и поток завершается:

java.lang.InterruptedException: sleep interrupted

зачем задавать один и тот же вопрос дважды?

Drew Gibson 09.12.2008 15:18

я забыл и отправил его дважды

eman 09.12.2008 15:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
8 899
5

Ответы 5

Вы должны выяснить, какой поток прерывает этот поток. Сами по себе потоки этого не делают.

пожалуйста, можете ли вы сказать мне, как я знаю, какой поток прерывает этот поток?

eman 09.12.2008 15:27

Поймайте исключение и попробуйте проанализировать объект Exception. В нем должна быть интересная информация.

guerda 09.12.2008 15:48

Я должен согласиться с комментарием Bombes: темы не прерываются сами по себе. Вопреки комментарию Джокиса - они не прерываются, когда происходит замена контекста потока (на самом деле, если поток спит, он отдаст квант любому потоку, у которого есть работа, но я отвлекся).

Кроме того, я бы посоветовал альтернативное средство связи, чем опрос файлов. Вы не можете быть уверены, например, в том, что после того, как вы заметили файл, он был полностью записан без дополнительной работы со стороны автора файла (например, переименования его, когда он был готов, или создания «готового» файла).

Подумайте об использовании чего-то более `` проталкивающего данные '', такого как RMI, HTTP-POST, очереди JMS и т. д.

Один поток прерывается, когда он блокируется (переход в спящий режим), а другой поток вызывает свой метод interrupt. Чтобы это произошло, вызов interrupt должен быть сделан явно.

Кажется, что повторение проверки файла было бы логичным, если поток был прерван, но, не зная причины прерывания, трудно сказать.

Как обычно, когда дело доходит до потоковой передачи, Брайану Гетцу есть что сказать по поводу InterruptedException:

http://www-128.ibm.com/developerworks/java/library/j-jtp05236.html

Если все, что вам нужно, это уведомление о создании файла, И вы можете (и желаете) перейти на собственный (JNI), И вам нужна только поддержка Win32, вы можете использовать код здесь.

да, мне нужно только получать уведомление, когда файл создается. Я вижу прикрепленный код, но не понимаю, что такое фильтр уведомлений? можешь сказать мне пожалуйста

eman 10.12.2008 13:58

это код C++, который вы должны скомпилировать в dll, а затем получить доступ через JNI (собственный интерфейс java). он не зависит от платформы и имеет другие ограничения, а JNI довольно медленно проходит через интерфейс, но работает отлично.

Ran Biron 15.12.2008 08:48

Что ж, если вы не знаете, что такое InterruptedException, и / или не хотите с этим ничего делать, очевидно, вам следует хотя бы что-то сделать, кроме возврата и выхода из цикла. Достаньте возврат, и дальше будете ждать.

Но я бы выяснил, почему вас прерывают. Что-то пытается отменить вашу цепочку.

Другие вопросы по теме