2
我有一个演员来控制GUI。 为了保证即时响应(没有卡在屏幕上),我将一个PinnedDispatcher分配给这个actor。为什么akka演员和线程是如此不同
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
}
演员的程序是这样的
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秒钟。 但是纯线程程序比男主角程序更为敏感,就像这样:
new Thread(new Runnable {
override def run(): Unit = {
while (true){
GUI.refresh
Thread.sleep(1000)
}
}
}).start()
我不知道为什么线程和演员是如此不同。因为这个演员应该有自己的线程。应该没有区别。