को बंद करें, मुझे केवल अपने प्रोग्राम का एक उदाहरण चलाना है। लेकिन मैं इसे पुराने लोगों को बंद करना चाहता हूं, अगर वे खुले हैं।जावा: अगर मेरे पास प्रोग्राम चलाने का एक उदाहरण है, तो मैं इसे कैसे पहचानूं, और फिर पुराने (0)
यह जावा में है।
को बंद करें, मुझे केवल अपने प्रोग्राम का एक उदाहरण चलाना है। लेकिन मैं इसे पुराने लोगों को बंद करना चाहता हूं, अगर वे खुले हैं।जावा: अगर मेरे पास प्रोग्राम चलाने का एक उदाहरण है, तो मैं इसे कैसे पहचानूं, और फिर पुराने (0)
यह जावा में है।
आप एक सर्वर लॉकेट को एक विशेष लॉक के रूप में उपयोग कर सकते हैं।
जब आपका ऐप शुरू होता है, तो यह एक सर्वर सॉकेट को पूर्वनिर्धारित पते पर बांधने का प्रयास करेगा। अगर यह विफल हो जाता है, तो इसका मतलब है कि ऐप का पिछला उदाहरण चल रहा है और उस पते का मालिक है। मालिक को बाहर निकलने के लिए कहने के लिए उस पते को पिंग करें।
serverSocket = new ServerSocket(localhost:8888)
if success,
start ServerSocketListeningThread
else
socket = new Socket(localhost:8888)
socket.close();
sleep(100);
repeat attempt of binding server socket
ServerSocketListeningThread
serverSocket.accept(); //block until someone connects
System.exit();
यह नीचे कमांड लाइन
telnet localhost 8888
यदि एप्लिकेशन Java Web Start का उपयोग करके लॉन्च किया गया है तो यह जेएनएलपी एपीआई की सिंगल इंस्टेंस सेवा का उपयोग कर सकता है। यहां एक demo. of the SIS है।
आपके पास हमेशा लॉक फ़ाइल हो सकती है, और सुनिश्चित करें कि आपका प्रोग्राम समाप्त हो गया है यदि यह उस पर एक विशेष लॉक प्राप्त नहीं कर सकता है।
संदर्भ
मुझे लगता है कि आप एक स्टैंडअलोन जावा कार्यक्रम के बारे में बात कर रहे हैं, प्रत्येक उदाहरण के लिए अपने स्वयं के JVM में चल रहा है। उस मामले में यहां के विकल्प मैं तुम्हारे लिए देख रहे हैं:
से अपने अनुप्रयोग बंद करने के लिए बस main()
विधि में Exiter.isAlone()
विधि कॉल आसान है। यह पिछले को मारता है। (यह अपरिवर्तनीय के समाधान का एक कार्यान्वयन है, धन्यवाद) एक सर्वर सॉकेट पोर्ट 8181 (इस उदाहरण में) पर सुन रहा है। अगर इसे कोई अनुरोध मिलता है, तो यह अस्तित्व में है और jvm (System.exist()) को रोकता है। जब आप एक नया एप्लीकेशन लॉन्च करते हैं, तो यह सॉकेट श्रोता स्थापित करने का प्रयास करता है। यदि यह ठीक है, तो पोर्ट व्यस्त है, तो इसे रोकने का अनुरोध भेजता है। विधि isAlone() पिछली हुई हत्या की प्रतीक्षा कर रही है। यदि आप इसे मुख्य (स्ट्रिंग [] एस) विधि की पहली पंक्ति में कॉल करते हैं, तो आप सुनिश्चित हैं कि पिछला हटा दिया गया है।
public class Exiter implements Runnable {
private static final Exiter instance = new Exiter();
private ServerSocket serverSocket;
private int port = 8181;
private boolean bStarting = true;
private Exiter() {
(new Thread(this)).start();
}
@Override
public void run() {
while (bStarting) {
try {
serverSocket = new ServerSocket(port);
bStarting = false;
awake();
} catch (IOException e) {
System.err.println("Exiter : "+e.getMessage()+" port "+port);
openSocketKillRequest();
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
try {
Socket s = serverSocket.accept();// Ca bloque
System.err.println("Kimll Request from :" + s.getRemoteSocketAddress());
System.exit(0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void openSocketKillRequest() {
try {
System.err.println("Send request kill previous");
Socket socket = new Socket("localhost", port);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Exiter getInstance() {
return instance;
}
private synchronized void awake(){
notifyAll();
}
public synchronized boolean isAlone() {
if(bStarting){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return true;
}
}
बस उत्सुक .. यदि ऐप। लिनक्स पर हत्या -9 कहकर लॉक समाप्त हो गया है, क्या जेवीएम समाप्त होने के बाद लॉक जारी किया जाएगा? –
मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह होगा, हाँ। – zigdon