2010-09-06 83 views
3

我想知道更多关于可以控制每个Scala演员运行的位置的程度。我碰巧遇到了一些特殊情况:需要高反应性,很大一部分代码对时间至关重要,最糟糕的是,我使用的是Android。考虑到这一点,我的主要目标是:尽可能使代码尽可能简单易懂。斯卡拉演员线程控制

我会非常想实现(其中的一些听起来不合理/彻头彻尾的愚蠢首先,阅读下面的理由)
- 我希望能够在一些特定的,始终不变的,任意的一些消息作出响应线程,但我不需要阻止它等待消息。
- 我希望我的处理大部分都是在工作线程池中完成的,理想情况下是在Scala参与者支持的情况下进行自动调整大小,同时保证此处理永远不会发生在上述任意线程上。

这些要求源于Android的必要性:Android框架使用特殊线程来触摸UI,并且如果您触摸来自另一个线程的任何UI对象,则会发生异常。通过这种方式,它强制执行某种线程/锁定模式,这正是我试图解决的问题。但无论如何,就是这样的:我必须确保我的一些处理,即处理UI对象的东西,正在这个线程上运行,没有其他处理,因为框架令人讨厌地说这就是我应该这样做的。 只要此线程正在处理我的代码,UI停止更新并且我的应用程序停止响应,就会产生恼人的副作用。所以我需要确保这个线程不会被随机选择用于我可能在某些反应中使用的长时间运行的代码,理想情况下它从不处理可能由另一个线程完成的事情。

android框架提供了一个名为Handle的类,它实现了某种消息传递 - 您将它发送给Runnable,并且它将在UI线程上运行。如果需要,我可以使用它。每次创建一个Runnable都会显着地混淆代码 - 可以做的一件事就是用某种方法封装它,这样我就可以在类似的代码中写上类似于
的代码。其中一些代码* /}
...哪个比新的Runnable(){def run(){}}好得多。另一方面,这基本上是onUIThread函数的功能,所以我会创建两个闭包 - 然后我不得不处理闭包的内存分配细节。我不得不这样做,因为每次我分配一个对象时,GC都有机会运行,并且在Android上通常会执行150ms的暂停,如果它发生在关键执行路径中,将会破坏我的用户体验。

那么到底:
- 我有静态关联与线程的演员,所以我可以有一个UI演员任何方式,反应{}里面,总是有UI线程上的代码运行?/*我知道这是不好的设计自己,阅读上述理由,看看为什么我不能帮助它*/
- 我有任何方法来确保这个特定的线程永远不会考虑回应消息在一个反应{}? - 考虑到我的限制,我可以做什么以获得更好的代码易读性?

回答

5

您可以通过扩展将任务推送到UI线程的IScheduler特征来实现客户调度程序,然后在需要在UI线程上运行的actor上覆盖调度程序方法。

有人与Swing尝试这种前阵子我,我想它的工作: http://scala-programming-language.1934581.n4.nabble.com/scala-Swing-event-thread-actors-td1987246.html

然后让其他演员使用正常调度。

但是我会指出,react {}会导致创建一个闭包,最终会被封装在一个runnable中。它还使用流量控制的异常,这会导致相当大的开销(我不知道Dalvik有多少)。因此,如果GC关闭真的会伤害您的应用程序的性能,我怀疑演员会为您节省。

+0

这听起来像我所需要的。非常感谢,我会研究这个!关于闭包,它只意味着在执行关键代码时不必为它们分配内存,因为这触发了(暂定的)GC,即使它没有任何清理内容,它也会破坏我的性能。但是如果我自己创建Runnables,那也是一样的,所以......没有免费的午餐。无论如何,非常感谢你的好回答! – Jean 2010-09-07 02:36:22