2010-03-26 12 views
7

विशेषज्ञ -मल्टी: थ्रेडिंग - क्या यह सही दृष्टिकोण है?

मुझे निम्नलिखित परिदृश्य में कुछ सलाह चाहिए।

मेरे पास कार्यों की एक सूची के साथ एक विन्यास फाइल है। प्रत्येक कार्य में शून्य, एक या अधिक निर्भरता हो सकती है। मैं इन कार्यों को समानांतर में निष्पादित करना चाहता था [अभी उन्हें क्रमशः निष्पादित किया जा रहा है]

विचार यह है कि कॉन्फ़िगरेशन फ़ाइल को पढ़ने और सभी कार्यों को लोड करने के लिए मुख्य प्रोग्राम होना है। व्यक्तिगत कार्यों को पढ़ें और इसे एक निष्पादक [कॉल करने योग्य] को दें जो कार्य करेगा और भविष्य में परिणाम देगा। जब कार्य निष्पादक (थ्रेड) को सबमिट किया जाता है तो यह अपनी निर्भरताओं के लिए पहले खत्म करने और अपना कार्य करने के लिए निगरानी करेगा।

क्या यह सही दृष्टिकोण है? जावा 1.5 सुविधाओं का उपयोग कर कोई और बेहतर दृष्टिकोण है?

+0

क्या आप 'चींटी' या 'मेवेन' उपयोगिता को पुन: पेश कर रहे हैं? आप इसके लिए 'चींटी' कार्यों को परिभाषित क्यों नहीं कर रहे हैं? –

+0

एसएलओटी ~ यह चींटी या मेवेन स्क्रिप्टिंग और कार्य निष्पादन से संबंधित है। ऊपर वर्णित कार्य डेटाबेस गतिविधि, संग्रह, नियम प्रसंस्करण आदि से संबंधित हैं [किसी भी संयोजन में हो सकते हैं!] – jagamot

+0

यह 1.5 फीचर पहले से ही है! –

उत्तर

5

ठीक लगता है, लेकिन Thread starvation deadlock से सावधान रहें। असल में, एक बाध्य धागा पूल का उपयोग न करें।

यहां एक उदाहरण है जो इस समस्या को दर्शाता है।
http://www.javaconcurrencyinpractice.com/listings/ThreadDeadlock.java

इसके अलावा, यदि आपके पास उदा। एक पूल डीबी कनेक्शन, आप भी समस्या में भाग सकते हैं। 10 धागे ब्लॉक किए जा सकते हैं, 11 वें धागे की प्रतीक्षा कर रहे हैं जो 11 वें पूल कनेक्शन का अधिग्रहण नहीं कर सकते हैं क्योंकि अब उपलब्ध नहीं है ..

+0

+1। इस तरह का सवाल SO पर आम है और कोई हमेशा इस जोखिम का उल्लेख किए बिना "सभी कार्यों को एक साथ सबमिट करें" समाधान सुझाता है। – finnw

+0

मुझे लगता है कि ThreadDeadlock.java से अन्य ऋण "अधिक कार्यों को सबमिट करने वाले कार्यों से सावधान रहें"। कुछ वातावरण में, आप थ्रेड पूल पर अधिकतम बाध्य सेट करना चाहते हैं। –

+0

मुझे लगता है, मैंने समस्या में भागना शुरू कर दिया। मैं इसे कैसे हल कर सकता हूं? – jagamot

3

आपने जो वर्णन किया है जावा 5/6 दृष्टिकोण है।

बस यह सुनिश्चित करें कि आपके कार्य/कॉलबल्स थ्रेडसेफ हैं/राज्य साझा नहीं करते हैं।

1

कार्यों के बीच संवाद करने के लिए ValueFuture (guava से) पर विचार करने पर विचार करें। प्रत्येक ValueFuture पर एक श्रोता जोड़ें जो केवल ExecutorService पर एक नया कार्य सबमिट करता है जब उसके सभी इनपुट उपलब्ध होते हैं। इस तरह आप किसी कार्य को पूरा करने के लिए इंतजार कर रहे कार्य के माध्यम से कभी भी थ्रेड ब्लॉक पार्ट-मार्ग नहीं लेंगे।

+0

हे, यह एक अच्छा विचार प्रतीत होता है! +1 –

1

डाटाबेस गतिविधि, संग्रह और नियम प्रसंस्करण चींटी (या Maven) के लिए एकदम सही उपयोग करता है

इस नए अंदाज़ में नहीं है कर रहे हैं। बस चींटी का प्रयोग करें।

प्रत्येक कार्य के लिए चींटी कार्य लिखें। चींटी के निर्भरता नियमों का उपयोग करके एक्सएमएल में निर्भरताओं को परिभाषित करें।

निर्भरताओं के आधार पर अपने कार्यों को चलाने के लिए चींटी को ढीला करें। आप कार्य के अपने उप-वर्ग को परिभाषित करने के बजाय "निष्पादन योग्य" चींटी कार्य (http://ant.apache.org/manual/tasksoverview.html#exec) से शुरू कर सकते हैं।

चींटी समानांतर कार्यों को समझती है। आपको कुछ भी करने की आवश्यकता नहीं है लेकिन कार्यों को समानांतर के रूप में घोषित करें। http://ant.apache.org/manual/Tasks/parallel.html

इसके लिए कोई नया सॉफ्टवेयर आविष्कार न करें। चींटी का प्रयोग करें।

+0

क्या आप जावा एप्लिकेशन में चींटी एम्बेड कर सकते हैं? –

+0

मुझे केवल इसे एक निर्माण उपकरण के रूप में पता था .. हालांकि मैंने मैनुअल पर एक नज़र डाली। तो संभवतः आप ant.jar को अपनी प्रोजेक्ट की निर्भरता के रूप में जोड़ सकते हैं, और प्रोग्रामेटिक रूप से एंटी स्क्रिप्ट को कॉल कर सकते हैं जो कार्यों का वर्णन करते हैं? –

+0

यह कार्य निष्पादित करके चींटी-संकल्प निर्भरताओं का बिंदु है। यही एकमात्र बिंदु है। एक जेएआर फ़ाइल संकलन और निर्माण करना उस तरह की प्रसंस्करण का सबसे आम अनुप्रयोग है। लेकिन * कुछ भी * जिसमें प्रसंस्करण और निर्भरता शामिल है, चींटी को सुंदरता से संभाला जा सकता है। –

1

असल में, आप बहु-थ्रेडिंग चाहते हैं जब एकाधिक प्रक्रियाओं को शुरू करने की लागत महंगी होती है।

जो, स्पष्ट रूप से, लगभग कुछ भी है जो JVM की प्रतिलिपि बनाता है।

ओपी का जवाब देने के लिए, एएनटी समानांतर में कार्यों चलाने में सक्षम है लेकिन समानांतर में लक्ष्य नहीं है। तो, भले ही आपके पास build.xml फ़ाइल है जिसे आप समानांतर चलाने के लिए बदलना चाहते हैं, आपको एक संभावित प्रमुख पुनर्लेखन करना होगा। (मुझे लगता है कि एएनटी डेवलपर्स द्वारा किए गए एक अजीब डिजाइन निर्णय थे क्योंकि आप पहले से ही लक्ष्य द्वारा वर्णित अपने निर्भरता ग्राफ को प्राप्त कर चुके हैं।)

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