我想更多地了解可以控制每个Scala actor在哪里运行的程度.我碰巧是在一个特殊的情况下:需要高反应性,代码的很大一部分对时间要求严格,最糟糕的是,我使用的是Android.考虑到这一点,我的主要目标是:使代码尽可能易读和直接.
我理想地想要实现的目标(最初听起来有些不合理/彻头彻尾的愚蠢,请阅读以下基本原理)
-我希望能够在某些特定的,总是相同的任意线程中响应某些消息,但是我不必阻塞它以等待消息.
-我希望大部分工作都在工作线程池上完成,理想情况下,在Scala actor支持的情况下自动调整大小,同时确保该处理永远不会在上面的任意线程上进行.
这些要求源于Android的必要性:Android框架使用特殊的线程来触摸UI,并且如果您触摸另一个线程中的任何UI对象,则会获得异常.通过这种方式,它强制执行某种类型的线程/锁模型,这正是我要解决的问题.但是无论如何,就是这样:我必须确保我的某些处理(即处理UI对象的处理)在此线程上运行,而没有其他处理,因为该框架烦人地说那是我应该怎么做.
只要此线程正在处理我的代码,UI就会停止更新,并且我的应用程序也将停止响应,这是一个令人讨厌的副作用.因此,我需要确保不会为我在某些react {}中可能会运行的长时间运行的代码随机选择该线程,并且理想情况下,它永远不要处理可能由另一个线程完成的事情.
android框架提供了一个称为Handle的类,该类实现了某种消息传递-向其发送Runnable,它将在UI线程上运行.如果需要,我可以使用它.每次创建一个Runnable都会使代码混乱—可以做的一件事是将其封装在某种方法中,这样我就可以编写类似
onUIThread {/ *一些代码* /}
…比新的Runnable(){def run(){}}好得多.另一方面,基本上就是onUIThread函数要做的事情,所以我要创建两个闭包-然后我必须处理闭包的内存分配细节.我必须这样做,因为每次分配对象时,GC都有机会运行,并且在Android上通常会暂停执行150ms,如果它在关键的执行路径中发生,则会破坏我的用户体验.
所以最后:
-我是否可以通过任何方式将actor与线程静态关联,以便可以拥有UI actor,在其内部进行react {}并始终在UI线程上运行其代码? / *我知道它本身就是一个糟糕的设计,请阅读上面的基本原理,以了解为什么我不能帮忙* /
-是否有任何方法可以确保不会在React {}中响应该特定消息而考虑该特定线程?
-考虑到我的约束条件,我有什么建议可以做,以获得更好的代码易读性?
解决方法:
您可以通过扩展将任务推送到ui线程上的IScheduler特性来实现客户调度程序,然后在需要在ui线程上运行的actor上重写调度程序方法.
某人曾与Swing一起尝试过此功能,但我认为它有效:
http://scala-programming-language.1934581.n4.nabble.com/scala-Swing-event-thread-actors-td1987246.html
然后让其他参与者使用常规调度程序.
但我要指出,react {}会导致创建一个闭包,最终将其封装在一个可运行的容器中.它还将异常用于流量控制,这会带来可观的开销(我不知道在Dalvik上要花多少钱).因此,如果GC的关闭确实在损害您应用程序的性能,我怀疑参与者会拯救您.