我有一個使用全局線程池的現有java/scala應用程序。我想開始在項目中使用演員,但希望使用同一個遊戲池的應用程序中的所有內容。如何爲演員指定一個線程池
我知道我可以設置參與者使用的線程的最大數量,但更願意共享線程池。這是必要的/合理的,是否可以指定演員的線程池?
如果這是不可能的/建議,當在已經使用線程的應用程序中集成actor時,是否有任何經驗法則?
謝謝。
我有一個使用全局線程池的現有java/scala應用程序。我想開始在項目中使用演員,但希望使用同一個遊戲池的應用程序中的所有內容。如何爲演員指定一個線程池
我知道我可以設置參與者使用的線程的最大數量,但更願意共享線程池。這是必要的/合理的,是否可以指定演員的線程池?
如果這是不可能的/建議,當在已經使用線程的應用程序中集成actor時,是否有任何經驗法則?
謝謝。
我相信你可以做這樣的事情:
trait MyActor extends Actor {
val pool = ... // git yer thread pool here
override def scheduler = new SchedulerAdapter {
def execute(block: => Unit) =
pool.execute(new Runnable {
def run() { block }
})
}
}
但它很容易重新使用由演員子系統使用的線程池。首先,你可以控制它的大小:
-Dactors.maxPoolSize=8
而且可以在其上調用工作:
actors.Scheduler.execute(f); //f is => Unit
缺乏的唯一的事情是安排工作的能力。爲此,我使用一個單獨的ScheduledExecutorService
是單線程和運行其上的演員線程池的工作:
object MyScheduler {
private val scheduler = Executors.newSingleThreadedScheduledExecutorService
def schedule(f: => Unit, delay: (Long, TimeUnit)) : ScheduledFuture[_] = {
scheduler.schedule(new ScheduledRun(f), delay._1, delay._2)
}
private class ScheduledRun(f: => Unit) extends Runnable {
def run = actors.Scheduler.execute(f)
}
}
然後你可以用它來安排事情:
MyScheduler.schedule(f, (60, SECONDS))
爲斯卡拉2.8 .1它是:
scala -Dactors.corePoolSize=20
我想你應該寫「val scheduler =」而不是「def scheduler =」,否則你會有多個調度器實例。 – 2012-06-13 02:05:04
此外,覆蓋executeFromActor(task:Runnable)和執行(task:Runnable)以立即在池中執行的效率更高:https://github.com/plokhotnyuk/actors/blob/master/src/test/scala/com /github/plokhotnyuk/actors/ScalaActorSpec.scala#L20 – 2013-05-10 12:10:19