我有一个Thread
,称之为WorkerThread
,它的任务是让一个给定的对象SomeObject
定期做一些工作。线程正在等待异步回调
SomeObject
涉及通过套接字进行一些通信。它需要做的一些工作是在另一个专用于套接字I/O的线程上执行的。打电话给CommsThread
。我认为CommsThread
是SomeObject
的内部实现。
虽然SomeObject
正在忙于其工作,但想法是在监视器对象上WorkerThread
将wait()
。当异步回调从SomeObject
发生时,将在回调处理程序中调用notify()
,然后Thread A
将继续其快乐的方式。
这以前工作 - 但仅仅是因为Object A
发生的CommsThread
范围内被执行其异步回调,这意味着notify()
可以在监控对象上调用,让WorkerThread
唤醒并继续。
我一直在重构一些东西,并意识到我认为这是非常糟糕的设计,我的类异步回调线程,而不是实例化的线程,或者这些回调发生在“内部“线程。回调以前发生在CommsThread
的情况下。因此,在SomeObject
内我已经使用Android Handler
在实例化SomeObject
的线程上发生异步回调。我相信这是更好的设计。但是这现在导致关于WorkerThread
的死锁情况。当然WorkerThread
现在无限期地位于wait()
。
这使我想到了两个相关的问题:
如果我设计一个具有异步回调的类或接口,是公约或只是一般一件好事回调发生无论是在线程创建对象,还是在UI线程上?
假设我按照上面的设计我的类,并且异步回调不会在单独的线程上发生,那么
WorkerThread
应该如何有效等待这种回调?想到的一种解决方法是在创建WorkerThread
之前在UI线程上实例化SomeObject
,然后将其传递给线程。异步回调将在UI线程的上下文中发生,因此wait()
/notify()
将起作用。
非常感谢。这是一个Android应用程序,其中各种命令(命令响应序列)通过蓝牙或USB连接执行。我设计我的命令对象的方式是,可以构造给定类型的命令,将其交给我的'命令执行器',命令执行器通过连接触发命令的负载,收集响应,然后回调异步处理器。我*认为*这与Android的做事方式非常吻合,并且由于我的一些各种状态机都是事件驱动的,但我总是愿意接受其他想法。 (续...) – Trevor 2014-09-01 23:19:10
在做了一些进一步的研究之后,我注意到Android惯例似乎是在UI线程上发生回调。如果我这样做,那将是一个解决方案。我可以做的另一种方法是更多地使用Android Looper和Handler类。当我明天有更多的时间时,我会试着扩展我的问题,提供更多关于我在做什么的更具体的信息,因为我会重视任何方向。 – Trevor 2014-09-01 23:24:08