2011-11-22 19 views
7

के लिए जांचें मेरे पास जावा (एक स्विंग गुई के साथ) में एक प्रोग्राम है, और मुझे केवल 1 उदाहरण मौजूद होना चाहिए। यदि इस कार्यक्रम के एक और उदाहरण को खोलने का प्रयास किया गया तो मैं वर्तमान उदाहरण को अग्रभूमि में लाया जाना चाहता हूं।एकल उदाहरण जावा प्रोग्राम

मैं यह कैसे कर सकता हूं?

अग्रिम धन्यवाद।

+6

http://stackoverflow.com/questions/2528844/only-one-swing-frame-window-opened-at-time – onurbaysan

+0

@mKorbel को कोई कोड पोस्ट करने की आवश्यकता नहीं है, सवाल स्पष्ट और स्वयं युक्त है। जुडास इमाम का जवाब सही है। – alf

+0

एकल इंस्टेंस ऐप को लागू करने के वैकल्पिक तरीके: http://stackoverflow.com/questions/177189/how-to-implement-a-single-instance-java-plication – ozhan

उत्तर

4

Java Web Start का उपयोग करके एप्लिकेशन लॉन्च करें और JNLP API के SingleInstanceService को लागू करें। यहां एक demo. of the SingleInstanceService है।

यदि यह प्रोग्राम का एक और उदाहरण खोलने का प्रयास करता है तो मैं वर्तमान उदाहरण को अग्रभूमि में लाया जाना चाहता हूं।

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

-3

पैटर्न singletone:

class SingleInstance { 
private static SingleInstance instance; 

public SingleInstance getInstance() { 
    if (instance==null) 
     instance = new SingleInstance(); 
    return instance; 
} 

private SingleInstance() { 
//construct it! 
} 
} 
+2

ऐप के भीतर एक सिंगलटन का उपयोग ऐप के कई उदाहरणों को रोकता नहीं है (यानी, एकाधिक जेवीएम उदाहरण)। –

+0

जो केवल एक क्लासलोडर के भीतर मदद करता है; ओपी कुछ और चाहता है "कंप्यूटर पर केवल एक उदाहरण" – alf

0

सी # में आप आमतौर पर एक Mutex Applicaiton पर बनाने शुरू करते हैं। यदि आप इसे नहीं बना/प्राप्त नहीं कर सकते हैं, तो एप्लिकेशन का एक और उदाहरण पहले ही चल रहा है। दुर्भाग्य से मैं 100% निश्चित नहीं हूं कि यह जावा में समान व्यवहार करता है या सटीक वाक्यविन्यास क्या है।

उम्मीद है कि इससे मदद मिलती है।

+5

(अन) सौभाग्य से, जावा mutexes प्रक्रियाओं के बीच साझा नहीं किया जाता है। – alf

+1

@ जानकारी के लिए आधा धन्यवाद - हर दिन कुछ नया सीखना ... यह मेरा जवाब बेकार बनाता है, लेकिन शायद एक और सी # डेवलपर है जो भी नहीं जानता था। –

+0

जरूरी नहीं बेकार। विचार वहाँ है। आपको सिर्फ म्यूटेक्स को लागू करने के लिए एक और तरीका खोजना होगा। –

2

जावा में कोई पिछला उदाहरण नहीं है, लेकिन आप temp (या/var/run) निर्देशिका में एक पिड फ़ाइल बना सकते हैं।

शीर्ष पर मौजूदा खिड़की लाने के लिए आप इस कार्यक्रम सूचित कर सकते हैं अपने आप को (और यह File.deleteOnExit() यह बाहर निकलने पर वैसे भी साफ करने के लिए देते हैं) तो, नामित पाइप, यूनिक्स सॉकेट, या जावा दूरस्थ विधि कॉल, आदि एक साधारण & गंदा माध्यम से एक छोटी फ़ाइल को लिखना है, $TEMP/foobar-app.bring-to-top कहें, और प्रोग्राम को समय-समय पर इस छोटी फ़ाइल को मतदान करना चाहिए, यदि यह अस्तित्व में आता है, तो विंडो को ऊपर लाएं और इस छोटी फ़ाइल को हटा दें।

मुझे लगता है कि जावा संकेतों को संभाल नहीं सकता है, यानी, kill -HUP PID जावा अनुप्रयोगों के लिए काम नहीं कर सकता है। यहां तक ​​कि अगर यह हो सकता है, हर ओएस में सिग्नल नहीं हैं।

3

आप इसे शटडाउनहूक और लॉक फ़ाइल का उपयोग करके कर सकते हैं, यह सरल example देखें।


सबसे पहले, जब आप अपने आवेदन शुरू, एक ServerSocket पर सुनने बनाना:

मुझे लगता है कि यह सबसे आसान तरीका है कि ...

+0

मैं सहमत हूं। यह लागू करने के लिए शायद सबसे आसान तरीका है। यही वह है जो मैं उपयोग कर रहा हूं। विंडोज़ पर फ़ाइल को बग हटाने के लिए स्टार्टअप पर एक छोटी सी चाल है। –

1

मैं एक सॉकेट और एक ServerSocket के साथ एक बार ऐसा किया कुछ बंदरगाह, उदाहरण के लिए 4004। चाल यह जांचना है कि क्या यह IOException फेंकता है या नहीं। यदि ऐसा होता है, तो कोई अन्य एप्लिकेशन चल रहा है या पोर्ट का उपयोग किसी अन्य एप्लिकेशन (check this list for commonly used ports) द्वारा किया जाता है; ध्यान दें कि टीसीपी और यूडीपी पोर्ट एक-दूसरे को अवरुद्ध नहीं कर रहे हैं), अन्यथा आप अपने एप्लिकेशन स्टार्टअप के साथ जारी रख सकते हैं। यदि कोई उदाहरण वर्तमान में चल रहा है, तो आप TCP Socket (जो गारंटी देता है कि आपका कनेक्शन आता है) को जोड़कर इसे सूचित करना चाहते हैं; यूडीपी नहीं करता है)।

ServerSocket ss = null; 
try { 
    ss = new ServerSocket(4004); 
} catch (IOException ex0) { 
    // Port either occupied by your application or a foreign one 
    // -> Connect 
    Socket s = null; 
    try { 
     s = new Socket(); 
    } catch (Exception ex1) { 
     // Something went wrong 
    } 
    if (s != null) { 
     // Send some singnal 
    } 
} 
if (ss == null) { 
    // Close or do something else 
} 

(मैं अपने स्मृति से बाहर यह लिखा है, तो कुछ चीजें गलत हो सकता है या बेहतर किया जा सकता है):

यहाँ एक उदाहरण है।

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