JVM

2013-06-27 11 views
7

द्वारा उपयोग किए गए थ्रेड की संख्या सीमित करने के लिए कोई भी थ्रेड की संख्या को सीमित कैसे करें? मैं जो करता हूं वह किसी के कोड (विचारधारा जैसा कुछ) चला रहा है, और वह थ्रेड की संख्या को सीमित करना चाहता है जिसे वह पैदा कर सकता है। ऐसा कैसे करें? कुछ जेवीएम सेटिंग या कुछ और?JVM

EDIT मैं अधिक निर्दिष्ट जानकारी जोड़ता हूं क्योंकि कुछ लोग मेरे बिंदु को प्राप्त नहीं कर रहे हैं।

  1. कुछ यादृच्छिक पुरुष मुझे एक कोड है जो अपने कंप्यूटर कश्मीर धागे की अधिकतम का उपयोग कर के भीतर निष्पादित किया जाना चाहिए निष्पादित करने के लिए
  2. कोड जा रहा है भेजने
  3. सभी होना चाहिए स्वचालित - Spoj, ideone, आदि
  4. की तरह काम
+0

जावा बाइट-कोड इंजेक्टर शायद? एक जावा-प्रोफाइलर की तरह लेकिन जांच के बजाय चीजें जोड़ती है। लॉन्च करने से पहले आप जेवीएम-मेमोरी स्पेस को सीमित कर सकते हैं लेकिन इसका सटीक मूल्य 1000 या 10000 हो सकता है, थ्रेड आकार भी महत्वपूर्ण है। मेमोरी स्पेस को सीमित करने से विपरीत प्रभाव हो सकता है। –

+0

एक थ्रेडपूल का उपयोग करें, एक सीमा –

+0

@BobFlannigon यह मेरा कोड नहीं है। मेरी मशीन केवल इसे चलाने के लिए जा रही है और जो मैं चाहता हूं वह नया धागा शुरू करने से मना कर देना है। उदाहरण के लिए यदि कोई थ्रेड फैलता है तो किसी भी मामले में यह निष्पादित नहीं हो सकता है। ऐसा कैसे करें? – abc

उत्तर

0

AFAIK, सीमा पूरी तरह से ओएस पर निर्भर करती है जो JVM पर नहीं है।

और आप एक Executor service

एक निर्वाहक कि तरीके प्रदान समाप्ति और तरीकों कि ट्रैकिंग एक या अधिक अतुल्यकालिक कार्यों की प्रगति के लिए एक भविष्य का निर्माण कर सकते का प्रबंधन करने के द्वारा उन्हें निगरानी कर सकते हैं।

ExecutorService pool = Executors.newFixedThreadPool(n); 
+0

कैसे निष्पादक सेवा मेरी मदद करती है अगर यह मेरा कोड नहीं है और कुछ थ्रेड फैलाने का उपयोग कर सकते हैं? सीमित इस पूल से केवल धागे हैं, लेकिन यह किसी को अन्य पूल बनाने से रोकता है या बस थ्रेड फैलाता है। – abc

2

आप धागा वांछित करता है कि निर्माता (s) या प्रारंभ विधि में में जाँच के लिए अपने स्वयं के उपवर्ग बना सकते हैं।

कोड आप चल रहे हैं सुनिश्चित करने के लिए उपयोग करता अपने कस्टम धागा वर्ग, आप अपने स्वयं के कस्टम वर्ग लोडर के साथ कोड लोड करना होगा और उस वर्ग लोडर बस java.lang.Thread वर्ग के लिए किसी भी अनुरोध और बाहर हाथ पकड़ता इसके बजाय आपकी कस्टम कक्षा (अवधारणा को अन्य कक्षाओं में भी बढ़ाया जा सकता है)।

चेतावनी: लागू यह ठीक से छोटा नहीं है।

+0

समस्या का समाधान करना मुझे अच्छा लगता है, लेकिन मैं इसका उपयोग नहीं करता, यह अधिक भाषा विशिष्ट है, जो वास्तव में मेरी गलती है - मेरा प्रश्न जावा विशिष्ट था :) – abc

6

लिनक्स पर, आप प्रोग्राम को एक अलग उपयोगकर्ता के रूप में चला सकते हैं और उस उपयोगकर्ता के लिए थ्रेड (प्रक्रियाओं) की संख्या को सीमित करने के लिए खोल कमांड ulimit -u nprocs का उपयोग कर सकते हैं। यदि सीमा पार करने के लिए प्रयास किया गया है, the JVM will throw an OutOfMemoryError

लेकिन आप ऐसा क्यों करना चाहते हैं? क्या आप चिंतित हैं कि कार्यक्रम कंप्यूटर के सभी सीपीयू संसाधनों का उपभोग करेगा? यदि हां, तो आप कम समय निर्धारण प्राथमिकता पर JVM चल रहा है, nice उपयोग पर विचार कर सकता है, इसलिए अन्य प्रक्रियाओं CPU के तरजीही उपयोग मिल जाएगा:

NPROCS=100 # for example 
NICENESS=13 # for example 
ulimit -u $NPROCS 
nice -n $NICENESS java ... 

कि ढंग में nice का उपयोग करना सभी की प्राथमिकता कम करना चाहिए धागे, लेकिन it is not clear that it does so for Linux

+0

असल में मैं एसपीओजे को सिस्टम की तरह लिखने की कोशिश करूंगा सी/सी ++ में पता लगाने में काफी आसान है जब कोई थ्रेड या राक्षस बनाने के लिए प्रयास करता है तो पाथ्रेड (कांटा और इतने पर ट्रैक किया जा सकता है)। मैंने सोचा था कि जावा थ्रेड के भौतिक धागे से कुछ भी नहीं है। यही कारण है कि कुछ जेवीएम सेटिंग के बारे में पूछना। ऊपर मतदान किया। सीपीयू संसाधन के बारे में मैं cpulimit का उपयोग करेंगे। आप समय निर्धारित कर सकते हैं कि कौन सी प्रक्रिया% – abc