2009-10-20 13 views
12

मेरे पास वैश्विक थ्रेड पूल का उपयोग कर मौजूदा जावा/स्कैला एप्लिकेशन है। मैं प्रोजेक्ट में अभिनेताओं का उपयोग करना शुरू करना चाहता हूं लेकिन उसी पूल का उपयोग करके ऐप में सबकुछ चाहूंगा।अभिनेताओं के लिए थ्रेड पूल को कैसे नामित करें

मुझे पता है कि मैं कलाकारों का उपयोग करने वाले अधिकतम थ्रेड सेट कर सकता हूं लेकिन थ्रेड पूल साझा करना पसंद करूंगा। क्या यह आवश्यक/उचित है, और क्या अभिनेता के थ्रेड पूल को नामित करना संभव है?

यदि यह संभव/अनुशंसित नहीं है, तो क्या पहले से ही थ्रेड का उपयोग कर रहे ऐप्स में कलाकारों को एकीकृत करते समय अंगूठे के कोई नियम हैं?

धन्यवाद।

उत्तर

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

मुझे लगता है कि आप लिखना चाहिए "वैल अनुसूचक =" "डीईएफ़ अनुसूचक =" के बजाय, अन्यथा आप शेड्यूलर के कई उदाहरण होगा। और निष्पादित (कार्य: Runnable) तुरंत पूल द्वारा निष्पादित करने के लिए: –

+0

यह भी executeFromActor (Runnable कार्य) ओवरराइड करने के लिए और अधिक कुशल है https://github.com/plokhotnyuk/actors/blob/master/src/test/scala/com /github/plokhotnyuk/actors/ScalaActorSpec.scala#L20 –

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 
संबंधित मुद्दे