2014-09-01 4 views
3

У меня есть Thread, назовите его WorkerThread, чья задача состоит в том, чтобы сделать данный объект, SomeObject, выполнять некоторую работу периодически.Thread, ожидающий асинхронного обратного вызова

SomeObject занимается выполнением некоторых сообщений через сокет. Некоторая работа, которую он должен выполнить, выполняется в другом потоке, посвященном вводу/выводу сокета. Назовите это CommsThread. Я считаю, что CommsThread является внутренней реализацией SomeObject.

Пока SomeObject занят своей работой, идея состоит в том, что WorkerThread будет wait() на мониторе Объект. Когда асинхронный обратный вызов происходит от SomeObject, в обработчике обратного вызова будет вызван notify(), а затем Thread A продолжит свое веселье.

Это ранее работал - но только потому, что Object A случилось, выполняя его асинхронного обратного вызова в контексте CommsThread, а это означает, что notify() можно было бы назвать на объекте монитора, позволяя WorkerThread разбудить и продолжить.

Я немного переосмыслил ситуацию и понял, что для моих классов довольно плохой дизайн для асинхронного обращения к потоку, отличного от того, на котором они были созданы, или для того, чтобы эти обратные вызовы выполнялись на «внутреннем " Нить. Обратные вызовы ранее выполнялись в контексте CommsThread. Поэтому в пределах SomeObject я использовал Android Handler, чтобы вызвать асинхронные обратные вызовы в потоке, на котором был создан экземпляр SomeObject. Это, я считаю, лучший дизайн. Но теперь это вызывает тупиковую ситуацию относительно WorkerThread. Конечно WorkerThread сейчас находится в wait() бесконечно.

Это подводит меня к двум смежным вопросам:

  • Если я проектирование класс или интерфейс, который имеет асинхронные обратные вызовы, это условность или просто вообще хорошая вещь для обратных вызовов произойдет либо на нить, на которой был создан объект, или на поток пользовательского интерфейса?

  • Предполагая, что я проектирую свои классы в соответствии с вышеизложенным, и асинхронные обратные вызовы не происходят в отдельном потоке, как должен WorkerThread эффективно ждать такого обратного вызова? Один способ обхода, который приходит на ум, - создать экземпляр SomeObject в потоке пользовательского интерфейса до создания WorkerThread, а затем передать его в Thread. Асинхронные обратные вызовы будут происходить в контексте потока пользовательского интерфейса, поэтому будет работать wait()/notify().

ответ

0

Третье решение, чтобы полностью отказаться от использования архаического wait/notify механизма и использовать реальную параллельную структуру.

Я бы посоветовал вам внимательно изучить ваши требования и рассмотреть возможность использования BlockingQueue для межпоточной связи или, возможно, некоторого тщательного использования Lock.

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

Текущее отношение к обратным вызовам заключается в том, что они почти всегда являются запахом.Тем не менее, есть несколько шаблонов, которые очень похожи на обратные вызовы, которые считаются приемлемыми.

+0

Большое спасибо. Это приложение для Android, где различные команды (которые являются последовательностями командного ответа) выполняются через Bluetooth или USB-соединение. То, как я разработал мои объекты команд, таков, что может быть создан определенный тип команды, переданный моему «исполнителю команд», который запускает полезную нагрузку команды через соединение, собирает ответ и затем вызывает асинхронный обработчик. Я думаю, что это очень хорошо подходит для Android-приложений и потому, что некоторые из моих государственных машин управляются событиями, но я всегда открыт для других идей. (Cont ...) – Trevor

+0

Проделав некоторые дальнейшие исследования, я отмечаю, что соглашение Android, похоже, связано с обратными вызовами в потоке пользовательского интерфейса. Если я это сделаю, это будет одно решение. Другой подход, который я мог бы сделать, - это больше использовать классы Android Looper и Handler. Когда я получу больше времени завтра, я попытаюсь расширить свой вопрос с помощью более конкретной информации о том, что я делаю, поскольку я бы оценил любое направление. – Trevor

Смежные вопросы