Блокирующая тема - Java - PullRequest
3 голосов
/ 08 июня 2011

вот моя проблема: у меня есть приложение, которое запускает симулируемый сервер локально.Вывод этой операции перенаправляется в файл журнала, и я хочу найти определенный шаблон в этом файле журнала во время его записи.

Я уже реализовал симуляцию tail -f (мне нужно работать с окнами), но я не могу заставить два потока работать нормально одновременно.

Вот пример (в основном):

server.launch();
patternFinder.start();

PatternFinder расширяет Thread, и вот как выглядит его метод запуска:

public void run() {
    while (true) {
        //tail -f implementation

        //I'll set a timeout when I can get it 
        //to work (the pattern is supposed to be found)
    }
}

Если я поставлю patternFinder.join() после start(), сервер остановитсяего выполнение и дождитесь возвращения patternFinder (но он этого не сделает, потому что в журнале ничего не пишется).Но дочерний поток должен блокировать основной поток, потому что мы не хотим, чтобы какая-либо инструкция выполнялась до тех пор, пока не будет найден шаблон (или не достигнут предел времени ожидания).

Есть идеи?

(ps: первое сообщение, поэтому не стесняйтесь сообщать мне, если я сделал что-то не так, или если вам нужно больше подробностей)

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Просто этот вопрос не остался без ответа. Я нашел какой-то обходной путь, но так и не понял, в чем действительно проблема.

Так что, очевидно, проблема заключалась в том, что я запускал свой сервер через ProcessBuilder скоманда выглядит следующим образом java [arguments] [classpath] fileToLaunch.Я перепробовал много вещей, но единственное, что сработало, это изменить команду на cmd /C start java [arguments] [classpath] fileToLaunch, чтобы она запускала сервер в новом окне, а затем все работало, как ожидалось.

Если кто-нибудь когда-нибудь сможет объяснить эту тайнудля меня, не стесняйтесь дать новый ответ, который все еще может быть принят.

0 голосов
/ 08 июня 2011

Вы должны использовать События, чтобы координировать ваши темы.Вы можете дождаться события в главном потоке и установить / сбросить его в своем дочернем потоке, когда что-то будет найдено.

Для этого вы можете использовать Manual или AutoResetEvents.Не уверен, как они называются в Java, но я уверен, что вы можете это выяснить.

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