2012-04-16 21 views
5

जावा में थ्रेड के लिए प्राथमिकता निर्धारित करने का कोई तरीका है जो SwingWorker ऑब्जेक्ट की विधि को कॉल करेगा?क्या स्विंगवर्कर द्वारा उपयोग किए गए पृष्ठभूमि थ्रेड की प्राथमिकता सेट करने का कोई तरीका है?

थ्रेड एपीआई में setPriority() विधि है। SwingWorker.execute() विधि एक कार्यकर्ता थ्रेड पर निष्पादन के लिए स्विंगवर्कर शेड्यूल करता है। मैं अपनी प्राथमिकता निर्धारित करने के लिए उस कार्यकर्ता थ्रेड तक पहुंच प्राप्त करना चाहता हूं।

मेरी समझ से यह कार्यकर्ता धागा डिफ़ॉल्ट कार्यकर्ता थ्रेड पूल से आता है। क्या इसे संभालने का एकमात्र तरीका मेरे अपने निष्पादक का उपयोग करना है?

+4

में सबमिट कर सकते एक Runnable है। यदि आप अपने सभी सीपीयू का उपयोग कर रहे हैं, तो प्राथमिकता केवल एक संकेत है जो JVM या OS अनदेखा करने के लिए स्वतंत्र है। IMHO यह आपकी समस्या का समाधान नहीं करेगा। –

+0

एप्लिकेशन विशेष रूप से विंडोज को लक्षित कर रहा है और जेवीएम मानक ओरेकल जेवीएम है। इस अन्य स्टैक ओवरफ्लो प्रश्न से यह इस परिदृश्य में कुछ अंतर डालता है: http://stackoverflow.com/questions/297804/thread-api-priority-translation-to-os-thread-priority – Clinton

+0

इससे कोई फर्क पड़ता है ओएस को संकेत दिया। चाहे आप सभी सीपीयू का उपयोग नहीं कर रहे हों, इससे कोई फर्क पड़ता है, मेरे पास सवाल है। AFAIK, यदि आपके पास अतिरिक्त सीपीयू है जो हर धागा चला सकता है तो प्राथमिकता के बावजूद चलाया जाएगा। यह केवल तभी मायने रखता है जब ओएस को प्राथमिकता के मामले में कोई विकल्प बनाना पड़ता है। –

उत्तर

7

JDK7 SwingWorker javadoc संकेत है कि डिजाइनरों के लिए उपयोगकर्ताओं को सीधे के साथ बातचीत या पृष्ठभूमि धागे को बदलने का इरादा नहीं था:

... the exact strategy of choosing a thread for any particular SwingWorker is unspecified and should not be relied on.

SwingWorker.getWorkersExecutorService (के कार्यान्वयन) के रूप में इस विचार को सुदृढ़ करने के लिए लगता है कि वे इसे इस तरह से लागू किया गया है जिसे आसानी से बदला नहीं जा सकता है।

स्विंगवर्कर सामान्य मामले के लिए बॉयलरप्लेट समाधान है और आपके पास एक सामान्य मामला नहीं है। मैं सुझाव दूंगा कि आप जो चाहते हैं उसे करने के लिए स्विंगवर्कर को हैक करने की कोशिश करने के बजाय पृष्ठभूमि कार्यों को चलाने के लिए कोड लिखें। इस तरह जो भी भविष्य में अपना कोड बनाए रखता है (शायद खुद भी!) यह सोचकर नहीं छोड़ा जाएगा कि क्यों स्विंगवर्कर अपेक्षा की तरह व्यवहार नहीं कर रहा है।

5

ऐसा करने का एकमात्र तरीका यह है कि निष्पादन विधि Thread.currentThread() का उपयोग कर वर्तमान धागे को पकड़ लेती है। फिर आप इस धागे की प्राथमिकता निर्धारित कर सकते हैं (बशर्ते कॉलर की अनुमति है)।

+2

मुझे लगता है कि यह विधि काम कर सकती है। 'DoIn.currentThread()' को "doInBackground()" विधि (कार्यकर्ता थ्रेड) में निष्पादित किया जाना चाहिए। –

+1

यह काम करने लग रहा था। मुझे लगता है कि विधि के अंत में मुझे इसे अपनी डिफ़ॉल्ट प्राथमिकता पर वापस स्विच करने की आवश्यकता हो सकती है क्योंकि थ्रेड को पूल में वापस कर दिया जाएगा और किसी और चीज़ के लिए उपयोग किया जाएगा। जेसन ब्रुच की तरह कहा कि यह एक खराब डिजाइन हो सकता है। – Clinton

2

SwingWorker के रूप में जब तक आप अपने सभी CPU की 100% के करीब उपयोग कर रहे हैं, प्राथमिकता की स्थापना कोई फर्क नहीं हो सकता है आप किसी भी java.util.concurrent.ExecutorService

+2

यह भी एक भविष्य है। –

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

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