2009-10-24 21 views
23

मेरे पास एक प्रोग्राम है जो कुछ धागे में चलता है। मुख्य थ्रेड अन्य धागे के साथ एक वस्तु के शेयरों और मुख्य में मैं को कॉल किया:जावा के धागे को प्राथमिकता सेट करना

synchronized(obj){ 
    do stuff 
} 

मैं एक संदेह है कि मुख्य थ्रेड भूखे जाता है और obj के लिए उपयोग नहीं मिल रहा है है। मैं मुख्य धागे की प्राथमिकता कैसे बढ़ा सकता हूं या यह डिफ़ॉल्ट रूप से अन्य धागे से पहले से अधिक है?

+1

मैकर ने प्राथमिकता को बदलने के तरीके से पहले ही व्यवहार किया है, लेकिन शायद आप अपने कुछ कोड पेस्ट कर सकते हैं। कुछ और गलत हो सकता है, या ओब्जे पर सिंक्रनाइज़ किए गए कम समय बिताने के लिए अन्य धागे प्राप्त करने का एक तरीका हो सकता है। –

+0

20 धागे के बीच प्राथमिकता कैसे सेट करें, क्योंकि धागा प्राथमिकता 1-10 से है, इसका मतलब है कि केवल 9 धागे प्राथमिकताओं को दिया जा सकता है .... ?? – anshulkatta

उत्तर

35

आपके पास थ्रेड क्लास में एक सेट प्राइरिटी() विधि है।

this javadoc देखें। अधिकतम करने के लिए

स्थापना धागा प्राथमिकता:

public static void main(String args[]) { 
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
    // Your main code. 
} 
+0

तो आप कह रहे हैं - प्रत्येक धागे में मैं सेट प्राथमिकता (न्यूनतम) करता हूं। क्या मुख्य तरीका है कि आप मुख्य धागे की प्राथमिकता को अधिकतम सेट करने के बारे में जानते हैं? और क्या इससे कोई फर्क पड़ता है? – Guy

+0

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

+3

20 धागे के बीच प्राथमिकता कैसे सेट करें, क्योंकि धागा प्राथमिकता 1-10 से है, इसका मतलब है कि केवल 9 धागे प्राथमिकताओं को दिया जा सकता है .... ?? – anshulkatta

9

लेखों की श्रृंखला here विभिन्न प्लेटफार्मों पर थ्रेड प्राथमिकताओं के प्रबंधन में कुछ जटिलताओं को इंगित करती है।

मुझे आश्चर्य है कि आपकी मूल समस्या यह है कि आपका कार्यकर्ता धागा बहुत सीपीयू गहन है और इसलिए शायद ही कभी उस बिंदु तक पहुंच जाए जहां वे स्वाभाविक रूप से प्रोसेसर के "जाने दें" (उदाहरण के लिए कुछ आईओ या सोते हुए।) यदि ऐसा है यह मामला है तो आप उन श्रमिकों में उपज() को कुछ कॉल शामिल कर सकते हैं, इसलिए अन्य थ्रेड को अधिक मौका देना।

5

आप setPriority() विधि का उपयोग कर सकते हैं। उदाहरण के लिए:

new MyThread("Foo").start(); 
Thread bar = new MyThread("Bar"); 
bar.setPriority(Thread.NORM_PRIORITY + 1); 
bar.start(); 

इस नए प्राथमिकता जो जल्दी फू अपने हाथ में लेने चाहिए बार देता है

संपादित करें:

bar.setPriority(Thread.MAX_PRIORITY); 
:

अपनी टिप्पणी का जवाब करने के लिए, आप का उपयोग कर अधिकतम priortiy सेट कर सकते हैं

+0

लेकिन आप थ्रेड में MAX_PRIORITY सेट कर रहे हैं और मुख्य थ्रेड नहीं। – Guy

+0

बस उस थ्रेड को सेट करें जो आप मुझे MIN_PRIORITY आदि से न्यूनतम कर सकते हैं ... – northpole

3

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

0

दूसरों पहले से ही उत्तर के रूप में, आप वास्तव में एक प्राथमिकता एक धागा करने के लिए इस प्रकार के रूप में स्थापित कर सकते हैं:

Thread.currentThread().setPriority(priority); 

लेकिन कृपया ध्यान रखें, अपने उदाहरण में, कि धागा प्राथमिकता का क्रम धागे पहुँच जाते लेना देना नहीं है एक सिंक्रनाइज़ ऑब्जेक्ट के लिए। जावा पहुंच प्रदान करने के लिए अन्य मानदंडों का उपयोग करता है। उदाहरण के लिए देखें this

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