How to designate a thread pool for actors

后端 未结 3 1273
闹比i
闹比i 2020-12-14 22:03

I have an existing java/scala application using a global thread pool. I would like to start using actors in the project but would like everything in the app using the same

相关标签:
3条回答
  • 2020-12-14 22:41

    For Scala 2.8.1 it's:

    scala -Dactors.corePoolSize=20
    
    0 讨论(0)
  • 2020-12-14 22:44

    But it's quite easy to re-use the thread pool used by the actor subsystem. Firstly you can control it's size:

    -Dactors.maxPoolSize=8
    

    And you can invoke work on it:

    actors.Scheduler.execute( f ); //f is => Unit
    

    The only thing it lacks is the ability to schedule work. For this I use a separate ScheduledExecutorService which is single-threaded and runs its work on the actors thread pool:

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

    Then you can use this to schedule anything:

    MyScheduler.schedule(f, (60, SECONDS))
    
    0 讨论(0)
  • 2020-12-14 22:48

    I believe you can do something like this:

    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 讨论(0)
提交回复
热议问题