2014-11-26 7 views
6

मैंने एक प्रोग्राम लिखा है जो स्वचालित रूप से छात्रों से सबमिट प्रोग्रामिंग असाइनमेंट ग्रेड करता है। प्रतिबिंब का उपयोग कक्षाओं को लोड करने और वस्तुओं को तत्काल करने के लिए किया जाता है। अनजान अनंत लूप छात्र असाइनमेंट में एक आम गलती है। एक धागा प्रत्येक छात्र सबमिशन को सौंपा गया है। एक मॉनिटर थ्रेड के चलने वाले समय का ट्रैक रखता है और अधिकतम समय से अधिक थ्रेड को समाप्त करने के लिए stop() विधि का उपयोग करता है। मेरा प्रोग्राम इरादे के रूप में काम कर रहा है, लेकिन stop() विधि java.lang.Thread में बहिष्कृत है। मैं एक क्लीनर समाधान पर सलाह की सराहना करता हूं।गतिशील रूप से लोड कक्षाओं में अनंत लूप कैसे समाप्त हो सकते हैं?

धन्यवाद।

+0

क्या होगा अगर आपके छात्र System.exit (0) का उपयोग दुर्घटना से करते हैं ...? – Adam

+2

@Adam जिसे उचित सुरक्षा प्रबंधक कॉन्फ़िगरेशन से बचा जा सकता है: http://stackoverflow.com/questions/5401281/preventing-system-exit-from-api – reegnz

+1

@lockstock उन पदों में से कोई भी समस्या का समाधान नहीं करता है। मैंने नहीं पूछा कि स्टॉप विधि को क्यों हटा दिया गया था, और मेरे थ्रेड उदाहरण कुछ झंडे पर लूप नहीं कर रहे हैं, न ही समस्या को हल करने में बाधा डालेंगे। – Jenks

उत्तर

5

stop()java.lang.Thread में अच्छे कारणों से बहिष्कृत किया गया था: यह हमेशा काम नहीं करता और JVM की कार्यप्रणाली में हस्तक्षेप कर सकता था।

आपकी सर्वश्रेष्ठ शर्त अलग-अलग JVMs में प्रोग्राम चलाने के लिए है। यदि आपको आवश्यकता हो तो आप प्रक्रियाओं को मार सकते हैं।

1

आपको एक निष्पादक सेवा और भविष्य API का उपयोग करना चाहिए। https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html

वायदा आप एक future.get() करते हैं और कितनी देर तक प्रदान की प्रतिदेय ब्लॉक करने के लिए अनुमति दी है के लिए समय समाप्त प्रदान कर सकते हैं के साथ

। यदि कॉल करने योग्य समाप्त नहीं हुआ है, तो टाइमआउट के बाद प्राप्त विधि अपवाद फेंक देगी। फिर पकड़ ब्लॉक में आप भविष्य के साथ निष्पादन रद्द कर सकते हैं। (सच);

+0

मैं उस एपीआई से अपरिचित हूं, लेकिन ऐसा लगता है कि यह मेरी समस्या का समाधान करेगा। धन्यवाद। – Jenks

+1

उपयोगी उत्तर लेकिन .cancel (true) एक अनंत लूप को रोक नहीं पाएगा (सत्य) {}, यह सिर्फ हुड के नीचे thread.interrupt() का उपयोग करता है। – Adam

+0

सच है, यह मेरे हिस्से से एक गलती थी, क्षमा करें ... मुझे लगता है कि एक सैंडबॉक्सिंग समाधान आदर्श होगा, या अलग जेवीएम-एस में चल रहा है। मैं इस तरह कुछ की बात कर रहा था: http://stackoverflow.com/questions/1715036/how-do-i-create-a-java-sandbox – reegnz

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