Как заставить поток ждать, пока файл не будет создан? - PullRequest
1 голос
/ 09 декабря 2008

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

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

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

java.lang.InterruptedException: sleep interrupted

Ответы [ 5 ]

4 голосов
/ 09 декабря 2008

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

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

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

http://www -128.ibm.com / DeveloperWorks / Java / библиотека / J-jtp05236.html

3 голосов
/ 09 декабря 2008

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

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

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

2 голосов
/ 09 декабря 2008

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

0 голосов
/ 09 декабря 2008

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

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

0 голосов
/ 09 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...