如何为actor指定一个线程池

时间:2009-10-20 23:31:42

标签: scala multithreading actor pool

我有一个使用全局线程池的现有java / scala应用程序。我想开始在项目中使用actor,但希望应用程序中的所有内容都使用相同的池。

我知道我可以设置actor使用但希望共享线程池的最大线程数。这是必要/合理的,是否可以指定actor的线程池?

如果不可能/推荐,在已经使用线程的应用中集成演员时是否有任何经验法则?

感谢。

3 个答案:

答案 0 :(得分:7)

我相信你可以这样做:

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 }
      })
  }
} 

答案 1 :(得分:6)

对于Scala 2.8.1,它是:

scala -Dactors.corePoolSize=20

答案 2 :(得分:2)

但是重新使用actor子系统使用的线程池非常容易。首先,你可以控制它的大小:

-Dactors.maxPoolSize=8

你可以调用它上面的工作:

actors.Scheduler.execute( f ); //f is => Unit

唯一缺少的是安排工作的能力。为此,我使用单独的ScheduledExecutorService 单线程并在actors线程池上运行它的工作:

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))