2012-02-10 1 views
7

मैं जावा जीयूआई संचालित अनुप्रयोग को डिजाइन करने की प्रक्रिया में हूं जो कई अलग-अलग कार्यों को चलाता है, प्रत्येक अपने स्वयं के स्विंगवर्कर विस्तारित वर्ग के भीतर। यह सामान्य डिजाइन है जिसका उपयोग मैं अपने धागे पर कार्यों को चलाने के लिए करता हूं और फिर भी ईडीटी को जीयूआई अपडेट करने के लिए स्वतंत्र रखता हूं। प्रत्येक SwingWorker एक निष्पादक का उपयोग कर अपने धागे पर शुरू किया गया है। NewCachedThreadPool।जावा स्विंगवर्कर और एकाधिक धागे

हालांकि, एक विशेष कक्षा के भीतर, एक ऐसा कार्य है जिसके लिए प्रक्रिया करने में काफी समय लगता है। कार्य में एक लूप होता है जो छह गुना तक कुछ गणना करता है।

मेरे पास प्रसंस्करण समय को तेज करने के लिए अपने स्वयं के धागे के भीतर छः गणनाओं में से प्रत्येक को लागू करने का विचार था, लेकिन मुझे यह लागू करने का सबसे अच्छा तरीका नहीं है।

क्या स्विंगवर्कर का विस्तार करना और रननेबल को लागू करना संभव है, और उसके बाद लूप के भीतर एक शून्य रन() विधि का उपयोग करें, प्रत्येक बार एक नया थ्रेड शुरू करें, या कैश किए गए थ्रेडपूल का उपयोग करें।

या क्या मैं मानक थ्रेड() कार्यान्वयन का उपयोग कर बेहतर हूं?

कोई सलाह या सुझाव की सराहना की जाएगी।

अग्रिम धन्यवाद

जोश

+7

* "मैंने प्रसंस्करण समय को तेज करने के लिए अपने स्वयं के धागे के भीतर छः गणनाओं में से प्रत्येक को लागू करने का विचार किया है" * [एसआईसी] ... सीपीयू-बाध्य ऐप को गति देने के लिए समानांतर गणना इस तरह की होगी यदि आप अपने ऐप को चलाने वाले सीपीयू पर अपने जावा ऐप में कम से कम 6 कोर उपलब्ध हैं तो एक स्पीडअप लाएं। यदि आपको केवल दो कोर कहते हैं, तो दो के बजाए 6 धागे फैलाने से वास्तव में आपके प्रोग्राम को धीमा कर दिया जाएगा ... – TacticalCoder

+0

आह हाँ, यह सही मायने रखता है !! धन्यवाद। –

+0

@ user988052 जो कोई समझ नहीं आता है। यदि आपके पास एक्स धागे हैं, तो प्रोग्राम को तेज़ी से चलाने के लिए आपको कम से कम x कोर की आवश्यकता नहीं है। जब तक कि 1 से अधिक लॉजिकल सीपीयू JVM के लिए उपलब्ध हो, तब तक ओएस उन तार्किक CPUs के बीच उन धागे को फैलाने का प्रयास करेगा। अधिक तार्किक CPUs - >> प्रति सीपीयू कम धागे - >> तेजी से खत्म होता है। यह उससे कहीं अधिक जटिल हो सकता है (उदाहरण के लिए, जब कुछ ताले शामिल होते हैं), मुझे पता है, लेकिन यह आमतौर पर इस तरह से काम करता है। –

उत्तर

5

user988052 निश्चित रूप से सही है - अगर आप एक बहु कोर सीपीयू नहीं है, छह अलग धागे में गणना कर वास्तव में भूमि के ऊपर की वजह से अपने आवेदन धीमी हो जाएगी जो थ्रेड के निर्माण और प्रशासन के साथ आता है।

यदि आप छह अलग-अलग धागे में यह गणना करना चाहते हैं, तो भी आप स्विंगवर्कर का प्रबंधन थ्रेड के रूप में उपयोग कर सकते हैं और इसमें 5-6 नए धागे को फेंक सकते हैं। ExecutorService का उपयोग करने का तरीका होगा, क्योंकि यह धागे के पूल का उपयोग करता है और इस प्रकार थ्रेड के निर्माण और निपटान के साथ आने वाले ओवरहेड को कम करता है।

संपादित करें: अपनी टिप्पणी का जवाब देने में:

मुझे लगता है कि सबसे अच्छा तरीका है एक Runnable में अपनी गणना को लागू (ताकि छह गणना में से प्रत्येक के लिए अलग से चला सकते हैं) हो सकता है, तो बस एक ExecutorService उपयोग करते हैं, का दृष्टांत अपने Runnable छः बार और ExecutorService.submit(Runnable task) का उपयोग करें। आप यह सब SwingWorker.doInBackground() विधि के भीतर कर सकते हैं।

आपको कभी भी run() विधि स्वयं को कॉल नहीं करना चाहिए - इसे थ्रेड/एक्जिक्यूटर्स सेवा द्वारा किया जाना चाहिए।

+0

तो क्या मुझे स्विंगवर्कर क्लास के भीतर एक रन विधि बनाने की आवश्यकता होगी, और फिर जब भी मैं एक्जिक्यूटर का उपयोग करके निष्पादित करने के लिए एक नया थ्रेड चाहता हूं तो कॉल करें? –

+0

अपनी टिप्पणी के उत्तर के लिए मेरा संपादन देखें। – mort

+0

मुझे लगता है कि यह इस बात पर निर्भर करता है कि आप कितनी देर तक गणना की उम्मीद करते हैं। अगर हम लगभग 2 सेकंड के गणना समय के बारे में बात कर रहे हैं, तो शायद 6 धागे का उपयोग करना एक अच्छा विचार नहीं है। लेकिन अगर यह उससे अधिक है (10s, 30s, 1min, 5min आदि), तो 6 धागे समझ में आता है। 6 धागे के बीच बनाने/प्रशासित/स्विचिंग द्वारा उत्पन्न सभी ओवरहेड कम्प्यूटेशनल रूप से सूउOO सस्ते हैं इन दिनों, यह एक मुद्दा नहीं होना चाहिए। यदि आपको लगता है कि यह 6 धागे बनाने के लिए और अधिक समझ में आता है, तो इसे करें। यदि उपयोगकर्ता के पास दोहरी कोर/ट्रिपल-कोर/क्वाड-कोर/आदि है तो यह चीजों को भी तेज कर सकता है। सी पी यू। –