/ / जावा मल्टीप्रेडिंग अनपेक्षित परिणाम [डुप्लिकेट] - जावा, मल्टीथ्रेडिंग

जावा मल्टीथ्रेडिंग अप्रत्याशित परिणाम [डुप्लिकेट] - जावा, मल्टीथ्रेडिंग

मैं जावा में मल्टीथ्रेडिंग सीख रहा था और यद्यपि दो थ्रेड्स के सापेक्ष सीपीयू उपयोग को मापने के लिए नमस्ते तथा आरे नीचे दिए गए कोड पर।

class Clicker implements Runnable{
long click=0;
Thread t;
private volatile boolean running =true;

public Clicker(int p)
{
t=new Thread(this);
t.setPriority(p);
}
public void run(){
while(running){
click++;
}
}

public void stop(){
running =false;
}

public void start(){
t.start();
}
}


public class HiLoPri {

public static void main(String[] args) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

Clicker hi = new Clicker(Thread.NORM_PRIORITY +2);
Clicker lo = new Clicker(Thread.NORM_PRIORITY -2);

lo.start();
hi.start();

try{
Thread.sleep(10000);
}catch(InterruptedException e){
System.out.println("Main Thread interrupted. ");
}

lo.stop();
hi.stop();

try{
hi.t.join();
lo.t.join();
}catch(InterruptedException e){
System.out.println("Interrupted Exception Caught");
}

System.out.println("Low priority : " + lo.click);
System.out.println("High priority : " + hi.click);
}

}

यहाँ विभिन्न प्राथमिकताओं के लिए आउटपुट हैं:

  1. lo = NORM_PRIORITY -2 और hi = NORM_PRIORITY +2: निम्न प्राथमिकता: 1725664879, उच्च प्राथमिकता: 1774465713 || उच्च / निम्न = 1.02827
  2. lo = NORM_PRIORITY -4 और hi = NORM_PRIORITY +4: निम्न प्राथमिकता: 2142378792, उच्च प्राथमिकता: 2180156175 || उच्च / निम्न = 1.01763
  3. lo = NORM_PRIORITY और hi = NORM_PRIORITY: निम्न प्राथमिकता: 2582216343, उच्च प्राथमिकता: 2581415280 || उच्च / निम्न = 0.99968

आउटपुट 3 से, मैंने समान प्राथमिकता के दो थ्रेड्स में समझा, पहले वाले को धीरे-धीरे अधिक सहूलियत मिलती है।

आउटपुट 1 और आउटपुट 2 के मामले में, देखेंप्राथमिकता मूल्य। जब प्राथमिकता अंतर अधिक हो जाता है, तो गिना जाता है। लेकिन जब मैं अंतर 0 (आउटपुट 3 में) सेट करता हूं, जैसा कि उपरोक्त अवलोकन के विपरीत है, तो काउंट्स में डिस्क्रिशन के बजाय वृद्धि दिखाई देती है।

क्या आप व्यख्या कर सकते हैं?

(स्पेस: जावा एसई 7, एएमडी ए 10 क्वाड कोर 2.3 जीएच और विंडो 8)

उत्तर:

उत्तर № 1 के लिए 1

जावा युक्ति यह गारंटी नहीं देती है कि थ्रेड्स को कोटा असाइन करते समय प्राथमिकताएं मानी जाती हैं।

हर धागे की प्राथमिकता होती है। जब प्रसंस्करण के लिए प्रतिस्पर्धा होती है संसाधन, उच्च प्राथमिकता वाले थ्रेड्स को आम तौर पर निष्पादित किया जाता है कम प्राथमिकता के साथ थ्रेड्स को वरीयता। ऐसी प्राथमिकता नहीं है, हालाँकि, गारंटी है कि सर्वोच्च प्राथमिकता धागा हमेशा रहेगा रनिंग और थ्रेड प्राथमिकताओं का उपयोग मज़बूती से लागू करने के लिए नहीं किया जा सकता है आपसी बहिष्कार।


जवाब के लिए 0 № 2

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

नोट: विंडोज पर एक थ्रेड की प्राथमिकता बढ़ाने के लिए आपको एक प्रशासक होने की आवश्यकता है और यूनिक्स पर आपको रूट होने की आवश्यकता है।