2009-10-20 152 views
12

我有一個使用全局線程池的現有java/scala應用程序。我想開始在項目中使用演員,但希望使用同一個遊戲池的應用程序中的所有內容。如何爲演員指定一個線程池

我知道我可以設置參與者使用的線程的最大數量,但更願意共享線程池。這是必要的/合理的,是否可以指定演員的線程池?

如果這是不可能的/建議,當在已經使用線程的應用程序中集成actor時,是否有任何經驗法則?

謝謝。

回答

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

我想你應該寫「val scheduler =」而不是「def scheduler =」,否則你會有多個調度器實例。 – 2012-06-13 02:05:04

+0

此外,覆蓋executeFromActor(task:Runnable)和執行(task:Runnable)以立即在池中執行的效率更高:https://github.com/plokhotnyuk/actors/blob/master/src/test/scala/com /github/plokhotnyuk/actors/ScalaActorSpec.scala#L20 – 2013-05-10 12:10:19

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

爲斯卡拉2.8 .1它是:

scala -Dactors.corePoolSize=20