Как назначить пул потоков для участников
У меня есть существующее приложение java/ scala с использованием глобального пула потоков. Я хотел бы начать использовать актеров в проекте, но хотел бы, чтобы все в приложении использовало тот же пул.
Я знаю, что могу установить максимальное количество потоков, которые используют участники, но предпочел бы использовать пул потоков. Является ли это необходимым/разумным, и можно ли обозначить пул потоков актеров?
Если это невозможно/рекомендуется, существуют ли какие-либо эмпирические правила при интеграции субъектов в приложения, которые уже используют потоки?
Спасибо.
Ответы
Ответ 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))