У меня есть 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()
.
Большое спасибо. Это приложение для Android, где различные команды (которые являются последовательностями командного ответа) выполняются через Bluetooth или USB-соединение. То, как я разработал мои объекты команд, таков, что может быть создан определенный тип команды, переданный моему «исполнителю команд», который запускает полезную нагрузку команды через соединение, собирает ответ и затем вызывает асинхронный обработчик. Я думаю, что это очень хорошо подходит для Android-приложений и потому, что некоторые из моих государственных машин управляются событиями, но я всегда открыт для других идей. (Cont ...) – Trevor
Проделав некоторые дальнейшие исследования, я отмечаю, что соглашение Android, похоже, связано с обратными вызовами в потоке пользовательского интерфейса. Если я это сделаю, это будет одно решение. Другой подход, который я мог бы сделать, - это больше использовать классы Android Looper и Handler. Когда я получу больше времени завтра, я попытаюсь расширить свой вопрос с помощью более конкретной информации о том, что я делаю, поскольку я бы оценил любое направление. – Trevor