我有一个现有的使用全局线程池的Java/Scala应用程序。 我想在项目中开始使用actors,但希望所有内容都使用同一个池。
我知道可以设置actors使用的最大线程数,但更喜欢共享线程池。 这是必要/合理的吗?是否可以指定actor的线程池?
如果不可能/不建议,在已经使用线程的应用程序集成actors时是否有任何经验法则?
谢谢。
我有一个现有的使用全局线程池的Java/Scala应用程序。 我想在项目中开始使用actors,但希望所有内容都使用同一个池。
我知道可以设置actors使用的最大线程数,但更喜欢共享线程池。 这是必要/合理的吗?是否可以指定actor的线程池?
如果不可能/不建议,在已经使用线程的应用程序集成actors时是否有任何经验法则?
谢谢。
我相信你可以做类似以下的操作:
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 }
})
}
}
对于Scala 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))