2012-05-08 11 views
6

मेरे पास एक ऐसा प्रोग्राम है जो लंबे समय तक गणना करता है, इसलिए मैं इसके प्रदर्शन को तेज करना चाहता हूं। इसलिए मैंने इस समय 3 धागे लॉन्च करने की कोशिश की, लेकिन java.exe अभी भी 25% CPU उपयोग पर कब्जा कर लिया है (इसलिए, केवल एक सीपीयू का उपयोग किया जाता है), और यह तब भी बनी हुई है जब मैं .setPriority(Thread.MAX_PRIORITY); का उपयोग करने की कोशिश करता हूं और रीयलटाइम पर java.exe की प्राथमिकता सेट करता हूं (24) । मैंने RealtimeThread का उपयोग करने की कोशिश की लेकिन ऐसा लगता है कि यह धीमा काम करता है। यह सही होगा यदि प्रत्येक थ्रेड को एक प्रोसेसर को आवंटित किया गया था और कुल CPU उपयोग 75% तक बढ़ गया है, लेकिन मुझे नहीं पता कि इसे कैसे किया जाए। और इस तरह मेरा कोड अभी दिखता है:मेरा थ्रेडेड प्रोग्राम केवल एक सीपीयू का उपयोग क्यों कर रहा है?

Thread g1 = new MyThread(i,j); 
g1.setPriority(Thread.MAX_PRIORITY); 
g1.run(); 
Thread g2 = new MyThread(j,i); 
g2.setPriority(Thread.MAX_PRIORITY); 
g2.run(); 
Thread g3 = new MyThread(i,j); 
g3.setPriority(Thread.MAX_PRIORITY); 
g3.run(); 
if (g1.isAlive()) { 
     g1.join(); 
} 
if (g2.isAlive()) { 
     g2.join(); 
} 
if (g3.isAlive()) { 
     g3.join(); 
} 
+2

'.start()' का उपयोग करें जैसा कि अन्य ने इंगित किया है - और फिर आप * प्राथमिकता के साथ खेलने के बजाए शेड्यूलर को शेड्यूलिंग छोड़ना चाहते हैं। जब तक आप थ्रेड शेड्यूलिंग के बारे में * काफी * नहीं जानते हैं, तो शेड्यूलर की नौकरी करने से बेहतर काम करने की संभावना पतली होती है (सर्वोत्तम पर)। –

+0

[जावा थ्रेड - रन() और प्रारंभ() विधियों के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/3027495/java-thread-run-and-start-methods) –

उत्तर

23

आप वास्तव में धागे का उपयोग नहीं कर रहे हैं।

आपको .start() पर कॉल करने की आवश्यकता है, .run() नहीं।

11

इसका सीपीयू के साथ कुछ लेना देना नहीं है - आप वास्तव में 3 धागे शुरू नहीं कर रहे हैं, आप मुख्य धागे पर सब कुछ चला रहे हैं। धागा शुरू करने के लिए, start() विधि पर कॉल करें, run() नहीं।

6

सबसे पहले, जैसा कि अन्य सुझाव देते हैं, आप वास्तव में एकाधिक धागे का उपयोग नहीं कर रहे हैं। ऐसा इसलिए है क्योंकि आप रन() विधि को कॉल कर रहे हैं, जो कॉलिंग थ्रेड में काम कर रहा है।

अब, अपने शेष प्रश्न को संबोधित करने के लिए, जिसका अर्थ यह है कि एक बहुसंख्यक प्रक्रिया की दक्षता को अधिकतम कैसे करता है। यह एक साधारण सवाल नहीं है, लेकिन मैं आपको मूल बातें दूंगा। (दूसरों को, झुकने में संकोच न करें।)

आपकी प्रक्रिया की दक्षता को अधिकतम करने का सबसे अच्छा तरीका सभी थ्रेडों को समान मात्रा में काम करने और उन्हें अवरुद्ध करने से रोकने की कोशिश करना है। यही कहना है कि एप्लिकेशन को कुशलतापूर्वक चलाने के लिए वर्कलोड को "संतुलन" करना आपका काम है।

सामान्य रूप से, आप किसी विशेष CPU कोर पर चलाने के लिए थ्रेड असाइन नहीं कर सकते हैं; यह आम तौर पर ओएस और सीपीयू का काम है। ओएस प्रक्रिया को शेड्यूल करता है (आपके द्वारा प्रदान की जाने वाली प्राथमिकताओं का उपयोग करके) और फिर सीपीयू निर्देश स्तर पर अपना स्वयं का शेड्यूलिंग कर सकते हैं। प्राथमिकताओं को स्थापित करने के अलावा, शेष शेड्यूलिंग पूरी तरह से आपके नियंत्रण से बाहर है।

संपादित करें: मैं सेमीकॉलन का आदी हूं।