我有使用全局线程池现有的Java / Scala的应用。 我想开始在项目中使用的演员,但会使用同一个池喜欢的应用程序的一切。
我知道我可以设置,演员使用的线程的最大数量,但宁愿共享线程池。 这是必要的/合理的,是有可能指定演员的线程池?
如果这是不可能/建议,在那些已经使用线程的应用程序集成的演员时,是有经验的任何规则?
谢谢。
我有使用全局线程池现有的Java / Scala的应用。 我想开始在项目中使用的演员,但会使用同一个池喜欢的应用程序的一切。
我知道我可以设置,演员使用的线程的最大数量,但宁愿共享线程池。 这是必要的/合理的,是有可能指定演员的线程池?
如果这是不可能/建议,在那些已经使用线程的应用程序集成的演员时,是有经验的任何规则?
谢谢。
我相信你可以做这样的事情:
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 }
})
}
}
斯卡拉2.8.1是:
scala -Dactors.corePoolSize=20
但它很容易重新使用由演员子系统使用的线程池。 首先,你可以控制它的大小:
-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))