асинхронный интерфейс в Java - PullRequest
3 голосов
/ 04 июля 2010

Я работаю над программой на Java, и прошло уже больше года с тех пор, как я в последний раз использовал Java, поэтому я немного заржавел.Эта программа использует Runtime.exec() для вызова других программ для выполнения своей грязной работы, и ей необходимо проанализировать их выходные данные и соответствующим образом обновить собственный графический интерфейс в реальном времени, пока работают другие программы.Какой лучший способ сделать это?В настоящее время я думаю о том, чтобы у моего класса external-program-executor был собственный внутренний поток, который опрашивает выходной поток внешней программы, а затем вызывает события, когда происходят интересные события, и затем реализует свой собственный EventListener интерфейс для моих классов пользовательского интерфейса.Однако я беспокоюсь о том, как это справится с асинхронной природой запускаемых событий.Кто-нибудь может дать какие-нибудь советы о том, как защитить слушателей от условий гонки и / или о лучшем подходе?Спасибо.

1 Ответ

2 голосов
/ 04 июля 2010
  • Вам не нужно опрашивать вывод во внешнем процессе. У объекта Process, возвращаемого из Runtime.exec(String), есть методы для получения InputStream для stderr и stdout и OutputStream для stdin.
  • Вы можете общаться, отправляя сообщения через OutputStream. Просто отправьте свои данные в поток.
  • Создает Thread, который ожидает на stdout OutputStream. Каждый раз, когда появляются новые данные для чтения, он считывает данные и создает событие.
  • Отправка события с использованием потока диспетчера событий EDT. Он также используется в графическом интерфейсе Swing / AWT, поэтому проблем нет.
  • Вы также можете использовать события для отправки материала на стандартный ввод. Просто создайте EventListener, который прослушивает определенные выходные события. Эти события (возможно, переведенные в другой формат) в OutputStream и могут быть прочитаны стандартным внешним процессом.

Удачи.

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