【发布时间】:2014-10-27 05:50:10
【问题描述】:
我有一个演员来控制 GUI。 为了保证即时响应(不卡在屏幕上),我为这个演员分配了一个 PinnedDispatcher。
val system = ActorSystem("sys1")
def createMonitor(clients:Seq[ActorRef],init_QPS:Int) = system.actorOf(Props( new MonitorGUI) ).withDispatcher("my-pinned-dispatcher"))
配置文件是这样的
my-pinned-dispatcher {
executor = "thread-pool-executor"
type = PinnedDispatcher
}
actor程序是这样的
class MonitorGUI() extends Actor {
val rate = 1000 milliseconds
val scheduler = context.system.scheduler
def receive = {
case GUIRefresh =>
GUI.refresh()
case StartMonitor =>
scheduler.schedule( rate + (300 milliseconds), rate ,self, GUIRefresh )
}
}
调度程序应该每秒调用一次“刷新”。 然而,当有很多其他参与者进行大量繁重的计算时(例如 98% 的 CPU),调度程序不能保证每秒“刷新”。例如 GUI 卡住 5 秒。 然而,纯线程程序比 actor 程序响应更快,如下所示:
new Thread(new Runnable {
override def run(): Unit = {
while (true){
GUI.refresh
Thread.sleep(1000)
}
}
}).start()
我想知道为什么线程和演员如此不同。因为这个actor应该有自己的线程。应该没有区别。
【问题讨论】:
标签: multithreading scala akka