2013-04-11 5 views
6

मेरा मुख्य धागा एक नया धागा बनाया गया और जब नया थ्रेड System.exit(-1) पर कॉल करता है, तो मेरा मुख्य धागा बंद हो जाता है। मैं निकास कोड कैसे संभाल सकता हूं और मुख्य धागे को जीवित रख सकता हूं?जावा थ्रेड में सिस्टम.एक्सिट

पीएस। नया थ्रेड अन्य .jar फ़ाइल में कुछ विधि कॉल करेगा, इसलिए मैं इसे संशोधित नहीं कर सकता।

+0

कि विधि रुकावट का जवाब है? क्या आपके पास इसे बाहर निकलने का कोई तरीका है? – assylias

+2

एर, जेवीएम की समाप्ति का मतलब सब कुछ खत्म नहीं होगा? बाधाओं के बावजूद? – Thihara

+2

@ तिहारा सवाल यह प्रतीत होता है: मैं मुख्य धागे को रोकने के बिना उस धागे को कैसे रोकूं। बेशक System.exit JVM को समाप्त कर देगा, और ऐसा लगता है कि ओपी इसे समझता है। लेकिन वास्तव में मैं देख सकता हूं कि इसे भी समझा जा सकता है: नया धागा System.exit को कॉल करता है और मैं इसे ऐसा करने से रोकना चाहता हूं। यह अस्पष्ट है ... – assylias

उत्तर

2

वर्ग:

public class MySecurityManager extends SecurityManager { 
    @Override 
    public void checkPermission(Permission perm) { 
    } 

    @Override 
    public void checkPermission(Permission perm, Object context) { 
    } 

    @Override 
    public void checkCreateClassLoader() { 
    } 

    @Override 
    public void checkAccess(Thread t) { 
    } 

    @Override 
    public void checkAccess(ThreadGroup g) { 
    } 

    @Override 
    public void checkExit(int status) { 
     throw new SecurityException("not allow to call System.exit"); 
    } 

    @Override 
    public void checkExec(String cmd) { 
    } 

    @Override 
    public void checkLink(String lib) { 
    } 

    @Override 
    public void checkRead(FileDescriptor fd) { 
    } 

    @Override 
    public void checkRead(String file) { 
    } 

    @Override 
    public void checkRead(String file, Object context) { 
    } 

    @Override 
    public void checkWrite(FileDescriptor fd) { 
    } 

    @Override 
    public void checkWrite(String file) { 
    } 

    @Override 
    public void checkDelete(String file) { 
    } 

    @Override 
    public void checkConnect(String host, int port) { 
    } 

    @Override 
    public void checkConnect(String host, int port, Object context) { 
    } 

    @Override 
    public void checkListen(int port) { 
    } 

    @Override 
    public void checkAccept(String host, int port) { 
    } 

    @Override 
    public void checkMulticast(InetAddress maddr) { 
    } 

    @Override 
    public void checkPropertiesAccess() { 
    } 

    @Override 
    public void checkPropertyAccess(String key) { 
    } 

    @Override 
    public boolean checkTopLevelWindow(Object window) { 
     return super.checkTopLevelWindow(window); 
    } 

    @Override 
    public void checkPrintJobAccess() { 
    } 

    @Override 
    public void checkSystemClipboardAccess() { 
    } 

    @Override 
    public void checkAwtEventQueueAccess() { 
    } 

    @Override 
    public void checkPackageAccess(String pkg) { 
    } 

    @Override 
    public void checkPackageDefinition(String pkg) { 
    } 

    @Override 
    public void checkSetFactory() { 
    } 

    @Override 
    public void checkMemberAccess(Class<?> clazz, int which) { 
    } 

    @Override 
    public void checkSecurityAccess(String target) { 
    } 
} 


Startop पर :

System.setSecurityManager(new MySecurityManager()); 
+0

यह काम करता है! ~ जेवीएम बाहर निकलने के बिना अपवाद फेंकता है – Dozer

5

आप नहीं कर सकते।

Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination.

जावाडोक है यही कारण है कि।

तो विधि पूरे JVM को समाप्त कर देगी। न केवल धागा ....

+0

* आप नहीं कर सकते। * यह असत्य है, अधिकांश जावा सुरक्षा/ओएस संवेदनशील कोड सुरक्षा प्रबंधक के माध्यम से रोका जा सकता है, यह जावा की शुरुआत के बाद से कार्यक्षमता में बनाया गया है। – bestsss

+0

ओह हाँ यह मेरे दिमाग फिसल गया ... लेकिन केवल इसलिए कि मुझे इसके बारे में पता नहीं था ... जानकारी के लिए धन्यवाद। – Thihara

5

आपका प्रश्न बेहद अस्पष्ट है, फिर भी यदि सिस्टम.एक्सिट कॉल सफल हो जाता है तो ओएस आपके आवेदन को समाप्त कर देगा।

यदि आप System.exit को सफल नहीं करना चाहते हैं तो आप एक सुरक्षा प्रबंधक स्थापित कर सकते हैं और इसे रोक सकते हैं। इसके अलावा आप कस्टम क्लासलोडर के माध्यम से कोड का उपयोग कर सकते हैं और कॉल को हटा सकते हैं।

संपादित करें: यदि आप w/सुरक्षा प्रबंधक जाते हैं, तो संभवतः सुरक्षा अपवाद को फेंकने से थ्रेड समाप्त हो जाएगा। अगर ऐसा नहीं होता है - धोखाधड़ी और थ्रेडडिथ फेंक दें। यदि वह अभी भी नहीं करता है - बस थ्रेड को पकड़ें उदा। for(;;) Thread.sleep(10000); उत्तरार्द्ध धागे और उसके संसाधनों को रिसाव करेगा लेकिन कम से कम आपके आवेदन को मार नहीं देगा।

link to similar question

+0

मुझे लगता है कि 'सुरक्षा प्रबंधक' मेरी ज़रूरतों को पूरा कर सकता है, मैं इसे आजमाउंगा। – Dozer

0

उपयोग जावा SecurityManager बाहर निकलने से अपने मुख्य थ्रेड बचाने के लिए और SecurityManager के साथ अन्य धागा कोड को चलाने के लिए।

संपादित करें: टॉमकैट या अन्य सर्वर से विचार लें कि वे जेएसपी में <% System.exit(1); %> जैसे कोड को कैसे प्रबंधित करते हैं।

+0

आप * अन्य धागे * डब्ल्यू/सुरक्षा प्रबंधक नहीं चला सकते हैं, यह वैश्विक है। आप प्रबंधक के भीतर धागे का पता लगा सकते हैं लेकिन यह अलग है। – bestsss

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