2013-04-25 6 views
10

क्या एक ही समय में एक से अधिक कार्यक्रम चलाने के लिए एक JVM के लिए संभव है? यदि हां, तो कैसे? यदि नहीं, क्यों?क्या एक ही समय में एक से अधिक कार्यक्रम चलाने के लिए एक JVM के लिए संभव है?

एक कार्यक्रम चलाने के लिए, हम केवल

java ProgramName 

करते लेकिन हम किसी अन्य प्रोग्राम को चलाने के लिए एक ही JVM उदाहरण का उपयोग कर सकते हैं?

+0

बहु-थ्रेडेड प्रोग्राम के बारे में क्या? –

+0

आपके पास फ़ौद का एक बिंदु है, लेकिन यह अनिवार्य रूप से वही "प्रोग्राम" है। – CodeBlue

+0

धागे संसाधन साझा करते हैं। इसलिए, यदि आपके पास स्थिर चर है, तो आप इसे किसी भी थ्रेड से एक्सेस कर सकते हैं। अन्यथा, आपको एक ही JVM में चलाने के लिए 2 प्रोग्राम क्यों चाहिए? –

उत्तर

10

उत्तर "प्रोग्राम" की आपकी परिभाषा पर निर्भर करता है। जावा प्रोग्राम जिनमें main विधि है और आप java NameOfClass से शुरू करते हैं, आमतौर पर उसी JVM में नहीं चलाया जा सकता है क्योंकि संसाधनों या नामस्थानों का कोई अंतर्निहित पृथक्करण नहीं होता है। उदाहरण के लिए, क्या होगा यदि दो प्रोग्राम एक ही लाइब्रेरी के विरोधाभासी संस्करणों का उपयोग करते हैं?

हमारे पास ऐसे एप्लिकेशन भी हैं जो एंटरप्राइज़ एप्लिकेशन जैसे JVM साझा करने के लिए डिज़ाइन किए गए हैं। ये वे प्रोग्राम हैं जिन्हें "एप्लिकेशन सर्वर" के संदर्भ में चलाने के लिए डिज़ाइन किया गया है, जो मूल रूप से अन्य प्रोग्राम चलाने के लिए एक प्रोग्राम है। एक एप्लिकेशन सर्वर क्लासलोडर्स और सुरक्षा प्रबंधकों का उपयोग कर अनुप्रयोग संसाधनों को अलग रखता है। उदाहरण के लिए, दो एप्लिकेशन लाइब्रेरी या विरोधाभासी वर्ग के नामों के विरोधाभासी संस्करणों का उपयोग कर सकते हैं और फिर भी विभिन्न क्लासलोडर्स के माध्यम से लोड होने के लिए एक JVM धन्यवाद साझा कर सकते हैं।

+2

मेरी समझ के लिए ओएसजीआई विभिन्न क्लासलोडरों में जारों को अलग करने का हल करता है। –

+0

मैं 'jar' को लागू करने के लिए बस बंद नहीं करूँगा, जिसका 'स्थिर मुख्य()' बस कई जार लोड करता है और विभिन्न धागे पर उनके 'स्थिर मुख्य()' को कॉल करता है। हां, यह नामस्थान/संसाधन टकराव पर समस्याग्रस्त होगा, लेकिन मुख्य रूप से यह काम करेगा। – peterh

4

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

यदि आप नहीं चाहते हैं कि प्रोग्राम एक दूसरे के साथ हस्तक्षेप करने या किसी भी राज्य को साझा करने में सक्षम हों, तो उसी प्रक्रिया में उन्हें चलाने का क्या मतलब है? यदि आप केवल एक ही मानक पुस्तकालय को लोड करके स्मृति को संरक्षित करना चाहते हैं, तो आप दो प्रोग्रामों को अलग करने के लिए SecurityManagers और ClassLoaders सेट अप कर सकते हैं। हालांकि, यह जरूरी है कि उन्हें प्रतिबिंब के साथ पागल सामान करने से रोकें।

2

यदि आप कमांड प्रॉम्प्ट से जावा कमांड निष्पादित कर रहे हैं, तो यह हमेशा अलग जेवीएम उदाहरण पर चलाएगा। यदि आप एक ही JVM का उपयोग करना चाहते हैं तो आप प्रोग्राम्स के लिए अलग थ्रेड का उपयोग कर सकते हैं। लेकिन जावा कमांड के साथ यह दो अलग-अलग प्रक्रियाएं होगी, इसलिए अलग जेवीएम।

0

java आदेश को चलाने के लिए आप java - the Java application launcher से

java [ options ] class [ argument ... ] 
java [ options ] -jar file.jar [ argument ... ] 

भी उपयोग करने के लिए हम पढ़ सकते हैं कि

जावा उपकरण एक जावा अनुप्रयोग की शुरूआत की जरूरत है। यह जावा रनटाइम पर्यावरण शुरू करके करता है, निर्दिष्ट वर्ग को लोड करता है, और उस वर्ग के मुख्य विधि का आह्वान करता है।

तो java जो एक वर्ग लोड और उसके मुख्य विधि लागू करेगा JVM के लिए प्रक्रिया बनाता है।

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

1

एक तरफ, आप नहीं कर सकते। JVM केवल एक प्रोग्राम चलाता है। दूसरी ओर, प्रारंभिक कार्यक्रम अनुक्रमिक रूप से या समांतर में, अन्य प्रोग्राम चला सकता है। अनुक्रमिक तरह से विशेष रूप से आसान है:

ClassName1.main(new String[]{arg1, arg2}); 
ClassName2.main(new String[]{arg1, arg2, arg3}); 
1

आईबीएम एक "बहु-टेनेंट" JVM http://www.ibm.com/developerworks/library/j-multitenant-java/ जो यह संभव होगा/आसान एक ही वर्चुअल मशीन के अंदर कई जावा प्रोग्राम को चलाने के विकसित कर रहा है।

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