代码之家  ›  专栏  ›  技术社区  ›  agilefall

如何为参与者指定线程池

  •  12
  • agilefall  · 技术社区  · 15 年前

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

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

    如果不可能/不推荐,那么在已经使用线程的应用程序中集成参与者时是否有经验法则?

    谢谢。

    3 回复  |  直到 13 年前
        1
  •  7
  •   Mitch Blevins    15 年前

    我相信你可以这样做:

    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
  •  6
  •   Antonin Brettsnajdr    13 年前

    对于scala 2.8.1,它是:

    scala -Dactors.corePoolSize=20
    
        3
  •  2
  •   oxbow_lakes    15 年前

    但是很容易重用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))