2008-10-08 7 views
7

मेरे पास एक प्रोग्राम 'foo' है जो विभिन्न धागे चला रहा है, fooT1, fooT2, .. fooTn।जावा धागे: क्या यह एक ही जेवीएम पर चल रहे एक अलग जावा प्रोग्राम से एक विशेष धागा को संभव/रोक/मार सकता है?

अब अगर मैं एक और प्रोग्राम 'बार' लिखना चाहता हूं, जो थ्रेड fooTr को मार सकता है, तो क्या यह संभव है?

कारण: थ्रेड fooTr उत्पाद लाइसेंस को ट्रैक करता है। अगर यह धागा मारा जाता है; कोई भी इस उत्पाद को अनिश्चित काल तक चला सकता है। और 'फू' को मारना ही 'फू' के रूप में सहनशील है क्योंकि यह लाइसेंस समाप्ति पर बिल्कुल किया जा रहा है।

सिस्टम: लिनक्स

नोट की फेडोरा वितरण: आदेशों जो JVM और कार्यक्रम foo शुरू /etc/init.d और जो rc.1/rc.2/RC की एक सभ्य ज्ञान है में रखा जाता है .3 संरचना इन्हें शुरुआती पैरामीटर बदल/जोड़ सकती है।

मुझे आशा है कि मेरा प्रश्न स्पष्ट है। यदि नहीं, तो मैं हमेशा इसे संपादित कर सकता हूं।

+0

उम, तो आप हमसे पूछ रहे हैं कि वाणिज्यिक उत्पाद पर लाइसेंसिंग कैसे बाईपास करें? संदेह यह है कि स्टेकओवरफ्लो उपयोग की शर्तों द्वारा ... –

+0

... या यह है कि आप जानना चाहते हैं कि अपने उत्पाद को क्रैकिंग से कैसे सुरक्षित रखें? –

+0

इतने देर से उत्तर देने के लिए खेद है, मैं एक निश्चित उत्पाद की रक्षा करना चाहता हूं (मेरा खुद नहीं)। – Swanand

उत्तर

4

मेरे ज्ञान के लिए यह सीधे करना संभव नहीं है। हालांकि आप क्या सोच सकते हैं कि आपके 'foo' पर किसी प्रकार की सेवा बनाना है जिसे थ्रेड को मारने के लिए 'बार' से बुलाया जा सकता है। निश्चित रूप से, इसे लागू करने के सैकड़ों तरीके हैं। मेरा पहला विचार RMI का उपयोग करके ऐसा करना होगा।

+0

उत्तर के लिए धन्यवाद। मैं बस यह सुनिश्चित करना चाहता हूं कि बार * थ्रेड को समाप्त नहीं कर पाएगा। ऐसा लगता है कि जावा इतना सुरक्षा प्रदान करता है। – Swanand

+1

यदि कोई आपके लाइसेंसिंग कोड को क्रैक करना चाहता है, तो वे हमेशा आपकी कक्षाओं को कम कर सकते हैं और इसे उस संस्करण के साथ प्रतिस्थापित कर सकते हैं जो लाइसेंस जांच को छोड़ देता है। – adib

1

अब तक एक ही जेवीएम में अलग-अलग कार्यक्रमों को चलाने के लिए संभव नहीं है, लेकिन स्टार्टअप समय को कम करने के लिए कुछ लोग इसकी जांच कर रहे हैं और उसी मशीन में चल रहे अलग-अलग जावा कार्यक्रमों की स्मृति और सीपीयू उपयोग

3

आप इसे एक अलग एप्लिकेशन के बिना भी कर सकते हैं। अपनी खुद की स्टार्टअप क्लास लिखें, जो एप्लिकेशन की मूल स्टार्टअप क्लास में पैरामीटर के पास-थ्रू करता है। आपकी कक्षा की मुख्य विधि हालांकि एक धागा तैयार करेगी जो समय-समय पर सभी धागे की सूची (उदाहरण के लिए, Thread.getAllStackTraces या Thread.enumerate) की जांच करेगी, अपमानजनक धागा पाता है, और stop() पर इसका आह्वान करता है। हालांकि Thread.stop बहिष्कृत है, यह अभी भी काम करता है।

एक और विकल्प जावा डीबगर के तहत एप्लिकेशन को चलाने के लिए है, कहें, jdb और फिर आवश्यक थ्रेड को निलंबित/मार दें। आप एप्लिकेशन के स्टार्टअप में पैरामीटर भी जोड़ सकते हैं ताकि JVM को जोड़ा जा सके, फिर चल रहे JVM में jdb संलग्न करें और थ्रेड को संदिग्ध/मार दें।

13

वास्तव में जावा डीबगर आपको इसमें अपवाद इंजेक्शन करके थ्रेड को मारने की अनुमति देगा। जब मैं इस प्रश्न पर आया, तो मैं पूरे जेवीएम को पोंछे बिना थ्रेड को मारने के लिए इस सुविधा का उपयोग करने के लिए इस सुविधा का उपयोग करने की कोशिश कर रहा था। आप आदेश पंक्ति विकल्पों के साथ JVM चलाते हैं चाहते:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 your.app.Main 

और की तरह कुछ के साथ डिबगर कनेक्ट:

jdb -attach 127.0.0.1:8888 

आप टाइप कर सकते हैं:

threads 

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

kill 0xe2e new java.lang.IllegalArgumentException("er"); 

और मैं संदेश प्राप्त:

killing thread: Swank REPL Thread 
Thread not suspended 
Expression must evaluate to an object 

("स्वांक आरईपीएल थ्रेड" है जिस धागे को मैं मारना चाहता हूं, और हाँ, मैंने इसे पहले निलंबित करने का प्रयास किया है;)

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

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