2014-09-01 195 views
3

我有一个Thread,称之为WorkerThread,它的任务是让一个给定的对象SomeObject定期做一些工作。线程正在等待异步回调

SomeObject涉及通过套接字进行一些通信。它需要做的一些工作是在另一个专用于套接字I/O的线程上执行的。打电话给CommsThread。我认为CommsThreadSomeObject的内部实现。

虽然SomeObject正在忙于其工作,但想法是在监视器对象上WorkerThreadwait()。当异步回调从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()将起作用。

回答

0

第三种解决方案是完全放弃使用古老的wait/notify机制并使用真正的并发结构。

我建议你仔细研究你的需求,并考虑使用BlockingQueue进行线程间通信或者使用一些小心的Lock

如果您可以扩展您的实际需求,而不是假设回调是正确的方法,我相信我们可以提供更多帮助。

目前对回调的态度是,它们几乎总是一种气味。但是,有一些模式看起来很像被认为可接受的回调。

+0

非常感谢。这是一个Android应用程序,其中各种命令(命令响应序列)通过蓝牙或USB连接执行。我设计我的命令对象的方式是,可以构造给定类型的命令,将其交给我的'命令执行器',命令执行器通过连接触发命令的负载,收集响应,然后回调异步处理器。我*认为*这与Android的做事方式非常吻合,并且由于我的一些各种状态机都是事件驱动的,但我总是愿意接受其他想法。 (续...) – Trevor 2014-09-01 23:19:10

+0

在做了一些进一步的研究之后,我注意到Android惯例似乎是在UI线程上发生回调。如果我这样做,那将是一个解决方案。我可以做的另一种方法是更多地使用Android Looper和Handler类。当我明天有更多的时间时,我会试着扩展我的问题,提供更多关于我在做什么的更具体的信息,因为我会重视任何方向。 – Trevor 2014-09-01 23:24:08