Подтвердить что ты не робот

Как назначить пул потоков для участников

У меня есть существующее приложение java/ scala с использованием глобального пула потоков. Я хотел бы начать использовать актеров в проекте, но хотел бы, чтобы все в приложении использовало тот же пул.

Я знаю, что могу установить максимальное количество потоков, которые используют участники, но предпочел бы использовать пул потоков. Является ли это необходимым/разумным, и можно ли обозначить пул потоков актеров?

Если это невозможно/рекомендуется, существуют ли какие-либо эмпирические правила при интеграции субъектов в приложения, которые уже используют потоки?

Спасибо.

4b9b3361

Ответ 1

Я считаю, что вы можете сделать что-то вроде этого:

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

Для Scala 2.8.1 это:

scala -Dactors.corePoolSize=20

Ответ 3

Но довольно просто повторно использовать пул потоков, используемый подсистемой актера. Во-первых, вы можете контролировать его размер:

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