J'ai une application Java / Scala existante en utilisant un pool de threads global. J'aimerais commencer à utiliser des acteurs du projet, mais j'aimerais tout dans l'application à l'aide du même piscine. P>
Je sais que je peux définir le nombre maximum de threads que les acteurs utilisent mais préfèrent partager le bassin de fil. Est-ce nécessaire / raisonnable, et est-il possible de désigner la piscine de thread de l'acteur? P>
Si ce n'est pas possible / recommandé, existe-t-il des règles de pouce lors de l'intégration des acteurs des applications qui utilisent déjà des threads? P>
merci. p>
3 Réponses :
Je crois que vous pouvez faire quelque chose comme ceci:
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 } }) } }
Je suppose que vous devriez écrire "VAL Scheduler =" au lieu de "DEF Scheduler =", sinon vous aurez plusieurs instances de planificateurs.
De plus, il est plus efficace de remplacer ExecuteFromActor (tâche: exécutable) et exécuter (tâche: exécution) à exécuter immédiatement par piscine: github.com/plokhotnyuk/actors/blob/master/src/test/scala/com / ...
Mais il est assez facile de réutiliser le piscine de thread utilisé par le sous-système Acteur. Tout d'abord, vous pouvez contrôler sa taille: et vous pouvez invoquer le travail dessus: p> La seule chose qu'il manque est la capacité de planifier le travail. Pour cela, j'utilise un Ensuite, vous pouvez utiliser ceci pour planifier n'importe quoi: p> séparé planchedexecutetorservice code> qui est fileté unique em> et exécute son travail sur le piscine de thread acteurs: p>
pour scala 2.8.1 C'est:
scala -Dactors.corePoolSize=20