如何为演员指定线程池

12

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

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

如果不可能/不建议,在已经使用线程的应用程序集成actors时是否有任何经验法则?

谢谢。

3个回答

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

我猜你应该写“ val scheduler =”,而不是“ def scheduler =”,否则你会有多个调度器实例。 - K J

6

对于Scala 2.8.1版本,它是:

scala -Dactors.corePoolSize=20

2

但是重新使用演员子系统使用的线程池相当容易。首先,您可以控制其大小:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接