चेतावनी : ये कार्यक्रम क्लोन बम हैं (कांटा बम का एक प्रकार का कम-खतरनाक लेकिन फिर भी खतरनाक रूप); जैसे, सैंडबॉक्सिंग या संसाधन सीमा के बिना उन्हें उत्पादन प्रणाली पर न चलाएं । क्लोन बम एक लूप में थ्रेड बनाते हैं (कांटा बम के विपरीत, जो एक लूप में प्रक्रियाएं बनाते हैं), इस प्रकार आप प्रश्न में प्रक्रिया को मारकर उन्हें रोक सकते हैं (कांटा बम की तुलना में बहुत कम खतरनाक बनाते हैं, जो बहुत मुश्किल हो सकता है) साफ़ करो); जब तक आप ऐसा करने का प्रबंधन करते हैं (या जब तक कि कार्यक्रम जीत नहीं जाता है और स्वाभाविक रूप से अपने आप बाहर निकल जाता है) तक वे आपके अधिकांश सीपीयू को टाई करेंगे। अपने ओएस को मेमोरी और सीपीयू समय की सीमा पर रखने के लिए कहने से इन कार्यक्रमों को उपयोग करने की अनुमति मिलती है, जिससे उन्हें परीक्षण करने के लिए एक सुरक्षित वातावरण तैयार करना चाहिए।
जावा (ओपनजेडके 8) , 65 60 बाइट्स (आवरण के लिए थोड़ा संशोधन के साथ)
Thread x=Thread.currentThread();new Thread(x::stop).start();
इसे ऑनलाइन आज़माएं!
catch (Exception …)
को बदलने के लिए प्रश्न के दोनों उदाहरणों की आवश्यकता होती है catch (Throwable …)
। यह सिद्धांत में अधिक सुरक्षित होना चाहिए , कम नहीं, लेकिन यह इस समाधान को संभव बनाने में सक्षम बनाता है।
मैंने इस उत्तर के पहले संस्करण में एक लैम्बडा के बजाय एक विधि संदर्भ का उपयोग करके 5 बाइट्स बचाए।
जावा 4, 104 बाइट्स (अप्रकाशित, मूल आवरण के साथ काम करना चाहिए)
final Thread x=Thread.currentThread();new Thread(){public void run(){x.stop(new Exception());}}.start();
इसे ऑनलाइन आज़माएं! (लिंक एक जावा 8 कार्यान्वयन के लिए जाता है, इस प्रकार काम नहीं करेगा)
जावा के आधुनिक संस्करणों से हटाए गए सुविधाओं का उपयोग करना, पहेली के उस संस्करण को भी हल करना संभव है जिसके लिए एक की आवश्यकता है Exception
। शायद, कम से कम। (जावा 4 अब तक बहुत पुराना है और मुझे यह याद नहीं है कि इसमें कौन-कौन सी सुविधाएँ थीं और इसमें शामिल नहीं हैं। जैसा कि देखा जा सकता है, तब जावा में बहुत कम सुविधाएँ थीं और इसलिए यह अधिक क्रिया थी; हमारे पास नहीं थी; लंबोदर, इसलिए मुझे एक आंतरिक वर्ग बनाना पड़ा।)
स्पष्टीकरण
इस प्रश्न के अधिकांश समाधान C # में हैं (एक जावा समाधान के साथ जो कोड इंजेक्शन के रूप में असंतुलित कोष्ठक का उपयोग करके धोखा देता है, और एक पर्ल समाधान जो जावा में भी नहीं है)। इसलिए मैंने सोचा कि यह दिखाने की कोशिश की जाएगी कि यह पहेली कैसे जावा में भी "ठीक से" हल की जा सकती है।
दोनों कार्यक्रम प्रभावी रूप से समान हैं (इस प्रकार यह तथ्य कि पहला कार्यक्रम काम करता है मुझे उच्च आत्मविश्वास देता है कि दूसरा कार्यक्रम भी काम करेगा, जब तक कि मैंने गलती से गैर-जावा -4 सुविधा का उपयोग नहीं किया Thread#stop
था ; जावा 5 में पदावनत किया गया था)।
जावा की Thread#stop
विधि, पर्दे के पीछे काम करती है, जिसके माध्यम से एक फेंकने योग्य को प्रश्न में धागे में फेंक दिया जाता है। उद्देश्य के लिए फेंकने योग्य उद्देश्य है ThreadDeath
( Error
, विशेष रूप से क्योंकि लोग अक्सर कंबल-कैच अपवादों की कोशिश करते हैं और जावा के डिजाइनर ऐसा नहीं चाहते थे), हालांकि यह आपको कुछ भी फेंकने की अनुमति देता है (या एपीआई के बाद कुछ बिंदु पर इस्तेमाल किया गया था) डिज़ाइन किया गया, जावा के डिजाइनरों ने महसूस किया कि यह एक अविश्वसनीय रूप से बुरा विचार था और इस पद्धति के संस्करण को हटा दिया जो तर्क को एक समान रूप से लेता है)। बेशक, यहां तक कि संस्करण जो फेंकता है ThreadDeath
वह एक काफी जोखिम भरा ऑपरेशन है, जिसके बारे में आप कुछ गारंटी दे सकते हैं (उदाहरण के लिए, यह आपको इस पहेली को हल करने की अनुमति देता है, कुछ ऐसा जो "संभव नहीं होना चाहिए", इसलिए आप इसे स्वीकार नहीं करेंगे इसका उपयोग करें, लेकिन जावा 8 के रूप में, यह अभी भी काम करता है।
यह कार्यक्रम एक नया धागा पैदा करके काम करता है, और इसे जबरन एक अपवाद को मुख्य धागे में वापस फेंकने के लिए कहता है। यदि हम भाग्यशाली हैं, तो यह उस समय में होगा जब हम आंतरिक catch
ब्लॉक के बाहर होंगे (हम catch
कार्यक्रम समाप्त होने तक बाहरी ब्लॉक से बच नहीं सकते , क्योंकि इसके चारों ओर एक लूप है)। क्योंकि हमारे पास लूप आसानी से पहले से ही जोड़ा गया है, यह बाइट-सेविंग है बस उस लूप का उपयोग करने के लिए हमें थ्रेड्स बनाते रहने की अनुमति है, इस उम्मीद में कि उनमें से एक आखिरकार सही टाइमिंग को हिट करेगा। यह आम तौर पर कुछ सेकंड के भीतर होने लगता है।
(टीआईओ नोट: टीआईओ का वर्तमान संस्करण इस कार्यक्रम को अपने निष्पादन में जल्दी से मारने के लिए इच्छुक है, संभवतः सभी थ्रेड्स बनाए जाने के कारण। यह टीआईओ पर काम कर सकता है, लेकिन मज़बूती से काम नहीं करता है, इसलिए अक्सर कुछ प्रयासों की आवश्यकता होती है। "आप जीते!" आउटपुट प्राप्त करें।