2009-05-12 9 views
24

मैं जावा एप्लिकेशन में थ्रेडिंग को कार्यान्वित करने के तरीके पर एक संभाल पाने की कोशिश कर रहा हूं जो लेनदेन प्रबंधन के लिए वसंत का उपयोग करता है। मुझे Spring documentation में TaskExecutor अनुभाग मिला है, और ThreadPoolTaskExecutor ऐसा लगता है कि यह मेरी आवश्यकताओं के अनुरूप होगा;कोई कार्यक्षेत्र उदाहरण के साथ कोई अच्छा वसंत धागा?

ThreadPoolTaskExecutor

इस कार्यान्वयन के लिए केवल एक जावा 5 वातावरण में इस्तेमाल किया जा सकता, लेकिन यह भी सबसे अधिक इस्तेमाल किया है कि वातावरण में से एक है। यह java.util.concurrent को कॉन्फ़िगर करने के लिए बीन गुणों का खुलासा करता है। थ्रेडपूल एक्स्सेक्टर और इसे टास्क एक्सक्लूसर में लपेटता है। यदि आपको किसी शेड्यूल किए गए थ्रेडपूलएक्सएटरेटर जैसे उन्नत की आवश्यकता है, तो यह अनुशंसा की जाती है कि आप इसके बजाय एक ConcurrentTaskExecutor का उपयोग करें।

हालांकि मैं पता नहीं इसे प्रयोग के बारे में जाने के लिए कैसे कर सकते है। मैं कुछ भाग्य के साथ थोड़ी देर के लिए अच्छे उदाहरण खोज रहा हूं। अगर कोई मेरी मदद कर सकता है तो मैं इसकी सराहना करता हूं।

उत्तर

33

यह बहुत आसान है। विचार यह है कि आपके पास एक निष्पादक वस्तु है जो कि एक बीन है, जो कि किसी भी वस्तु को नए कार्य को आग लगाना चाहता है (एक नए धागे में)। अच्छी बात यह है कि आप स्प्रिंग कॉन्फ़िगरेशन को बदलकर किस प्रकार के कार्य निष्पादक का उपयोग करने के लिए संशोधित कर सकते हैं। नीचे दिए गए उदाहरण में मैं कुछ उदाहरण वर्ग (क्लासविथमेथ टॉफ़ीयर) ले रहा हूं और इसे आग करने के लिए एक रननेबल ऑब्जेक्ट में लपेट रहा हूं; आप वास्तव में अपने स्वयं के वर्ग में रननेबल को भी कार्यान्वित कर सकते हैं, और फिर निष्पादन विधि में आप केवल classWithMethodToFire.run() पर कॉल करेंगे।

यहां एक बहुत ही सरल उदाहरण है।

public class SomethingThatShouldHappenInAThread { 
    private TaskExecutor taskExecutor; 
    private ClassWithMethodToFire classWithMethodToFire; 

    public SomethingThatShouldHappenInAThread(TaskExecutor taskExecutor, 
               ClassWithMethodToFire classWithMethodToFire) { 
      this.taskExecutor = taskExecutor; 
      this.classWithMethodToFire = classWithMethodToFire; 
    } 

    public void fire(final SomeParameterClass parameter) { 
      taskExecutor.execute(new Runnable() { 
       public void run() { 
        classWithMethodToFire.doSomething(parameter); 
       } 
      }); 
    } 
} 

और यहाँ वसंत सेम हैं:

<bean name="somethingThatShouldHappenInAThread" class="package.name.SomethingThatShouldHappenInAThread"> 
    <constructor-arg type="org.springframework.core.task.TaskExecutor" ref="taskExecutor" /> 
    <constructor-arg type="package.name.ClassWithMethodToFire" ref="classWithMethodToFireBean"/> 
</bean> 

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="queueCapacity" value="25" /> 
</bean> 
+0

मुझे लगता है कि मेरी समस्या सोच रहा है इस और अधिक जटिल तो यह है। मैंने http://docs.huihoo.com/javadoc/spring/2.0/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html#createQueue(int) देखा और मुझे लगता है कि एक थ्रेडपूल टास्क एक्स्सेलर को क्यूइंग तंत्र में बनाया गया था। –

+0

शायद मुझे गलत नहीं था, कतार कैपेसिटी क्या है? मुझे अभी भी लगता है कि मैं यहाँ कुछ याद कर रहा हूँ। –

+12

यदि कतार क्षमता 0 से अधिक है, तो यह एक कतार बनाता है, ताकि किसी विशेष कार्यकर्ता द्वारा निकाले गए कार्यों को पूल से थ्रेड उपलब्ध होने तक प्रतीक्षा कर सकें। क्षमता बताती है कि कतार में कितनी रिक्त स्थान हैं। यदि कतार भर जाती है, तो निष्पादक ब्लॉक करेगा (यानी निष्पादन विधि तब तक वापस नहीं आ जाएगी जब तक कोई स्थान खुलता नहीं है)। कतार पर दस्तावेज़ यहां दिया गया है: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/LinkedBlockingQueue.html –

संबंधित मुद्दे