2011-08-09 27 views
6

मुझे जावा में "वॉचडॉग" लिखना है, जो सुरक्षित है कि थ्रेड बहुत लंबा प्रदर्शन नहीं करते हैं। ऑब्जेक्ट्स की शुरुआत के साथ यह कोई समस्या नहीं है, मैंने कक्षा बनाई है, जो वॉचडॉग और कन्स्ट्रक्टर को रन() विधि में प्रतिबिंब के साथ कॉल करता है।जावा (ओवरफ्लो और इतने पर) में विधियों को सुरक्षित करने के लिए कैसे करें

एक थ्रेड रोकने के लिए आसान है, लेकिन मैं वस्तुओं के सामान्य तरीकों को कैसे सुरक्षित कर सकता हूं? उदाहरण के लिए मैं किसी ऑब्जेक्ट की विधि को कॉल करता हूं और यह विधि अंतहीन पाश निष्पादित करती है, आप यह कैसे करेंगे?

धन्यवाद वस्तुओं की

+0

शायद पहलू करेंगे? –

+0

"एक धागा बंद करना आसान है", नहीं, यह नहीं है। मैं समझ नहीं पा रहा हूं कि "मैं वस्तुओं के सामान्य तरीकों को कैसे सुरक्षित कर सकता हूं?", न तो उदाहरण जो अंतहीन पाश के साथ आता है। – toto2

+0

http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html उन सभी को पढ़ें, और फिर जांचें कि आप अभी भी स्टॉप() को कॉल करना चाहते हैं। शायद आपकी समस्या के आसपास काम करने के लिए प्रोवर्बियल बॉक्स के बाहर कुछ सोच आवश्यक है। – RichColours

उत्तर

3

सामान्य तरीकों कुछ धागे पर चल रहे हैं। यह एडब्ल्यूटी इवेंट डिस्पैचर या जो कुछ भी कहा जाता है वह हो सकता है। या यह एक कंसोल अनुप्रयोग का मुख्य धागा हो सकता है।

वे थ्रेड के लिए अलग नहीं हैं जिन्हें नए थ्रेड() के साथ बुलाया जाता है।

मुझे लगता है कि आपके वॉचडॉग को वीएम में सभी धागे को देखने और उन लोगों की तलाश करने की आवश्यकता है जिनके पास उपयोग है> = कुछ थ्रेसहोल्ड।

अब तक आपके पास क्या कोड है?

रिच

+0

ओकी, शायद मैंने इसे गलत बताया है, मैं अपने वॉचडॉग को उन सभी थ्रेडों को देता हूं जिन्हें मैं देखना चाहता हूं। मैं केवल ऑब्जेक्ट को प्रारंभ करना चाहता हूं और थ्रेड में प्रत्येक विधि को चलाता हूं, और उस थ्रेड को मेरे वॉचडॉग पर देता हूं। – Nicolas

+0

हाय निकोलस क्या आप इस पर विस्तार कर सकते हैं? विशेष रूप से "मैं केवल ऑब्जेक्ट को प्रारंभ करना चाहता हूं और थ्रेड में प्रत्येक विधि को चलाता हूं, और उस थ्रेड को मेरे वॉचडॉग पर देता हूं।" अंश। मैं शायद मदद कर सकता हूं, लेकिन मुझे समझ में नहीं आता कि आप क्या कर रहे हैं। – RichColours

+0

यहां एक सुरक्षित उदाहरण के लिए मेरा कोड है और एक सुरक्षित विधि कॉलिंग है: http://pastebin.com/v8kdvdUW आशा है कि आप समझ सकते हैं कि मैं क्या करना चाहता हूं। – Nicolas

4

पहले, मैं कहना चाहिए कि एक धागा रोक नहीं आसान है। वास्तव में, सामान्य मामले में, धागे को सुरक्षित रूप से नहीं रोका जा सकता:

  • आप एक धागा आप बंद करना चाहते पर Thread.interrupt() कॉल कर सकते हैं, लेकिन कोई गारंटी नहीं है कि धागा बाधा देखेंगे नहीं है, अकेले वास्तव में जाने रूक जा।

  • आप बहिष्कृत Thread.stop() विधि को कॉल कर सकते हैं, लेकिन यह विधि असुरक्षित है। यदि आप इसे दुर्भाग्यपूर्ण पल में बुलाते हैं, तो आप आधा अद्यतन राज्य में डेटा संरचनाओं को छोड़ सकते हैं, सिग्नल पर आने वाले अन्य धागे (हमेशा के लिए) छोड़ सकते हैं जो आने वाले नहीं होंगे।


यहाँ कैसे मैं विधि के निष्पादन के लिए एक निगरानी को लागू होता है।

सबसे पहले मैं वॉचडॉग सेवा में दो कॉल जोड़ने के लिए विधि को संशोधित करता हूं; जैसे

  1. startMethod(maxTime)now + maxTime की समाप्ति के समय के साथ कतार में एक प्रविष्टि जोड़ना होगा:

    public void someMethod(...) { 
        Watchdog.startMethod(maxTime); 
        // do stuff 
        Watchdog.endMethod(); 
    } 
    

    इसके बाद, मैं एक प्राथमिकता कतार समाप्ति समय पर आदेश दिया साथ निगरानी लागू होगी। प्रवेश समय-समय पर वर्तमान धागा (जब विधि बुलाया गया था के लिए एक संदर्भ भी शामिल होगा।

  2. endMethod() वर्तमान थ्रेड के लिए एक() कतार प्रवेश के लिए विचार करेंगे, और इसे हटाने अगर मिल गया।
  3. प्रहरी धागा होगा पहली कतार प्रविष्टि को देखें। अगर उस प्रविष्टि में 'अब' से कम की समाप्ति हुई थी, तो वॉचडॉग एंट्री को हटा देगा, इसके धागे को रोक देगा और अगली प्रविष्टि की जांच करेगा। अगली प्रविष्टि की समयसीमा समाप्त होने तक दोहराएं।

कुछ विचारों को डेटा संरचनाओं को दिया जाना चाहिए, और उन मामलों से निपटने की आवश्यकता है जहां endMethod कॉल छोड़ दिए गए हैं। (वास्तव में, के बाद से एक विधि कॉल एक अपवाद के कारण समाप्त कर सकते हैं, endMethod() कॉल वास्तव में एक finally ब्लॉक में किया जाना चाहिए।)

ध्यान दें कि startMethod और endMethod कॉल (और शायद चाहिए) एक टिप्पणी के द्वारा डाला जा सकता है प्रोसेसर या ऐसा कुछ।


जटिलता को देखते हुए, और तथ्य यह है कि आप धागा (सुरक्षित रूप से) को रोकने के लिए गारंटी नहीं दे सकते, मैं कुछ समाधान है कि एक विधि प्रहरी को शामिल नहीं करता के बारे में सोच चाहते हैं।

+0

समस्या को हल करने का यह सही तरीका है। कोई विचार नहीं कि इसे उत्तर के रूप में क्यों नहीं चुना जाता है। अगर कोई बॉक्स समाधान से बाहर निकलना चाहता है तो @ yegor256 प्रस्तुत @ टाइमएबल को आज़माएं। लेकिन यह "हस्तक्षेप के बाद सफाई" की समस्या का समाधान नहीं करता है। व्यक्तिगत रूप से मैं अभी भी अपना खुद का पहलू लिखूंगा। –

1

jcabi-aspects से @Timeable एनोटेशन का उपयोग करने का प्रयास करें:

public class Resource { 
    @Timeable(limit = 5, unit = TimeUnit.SECONDS) 
    public String load(URL url) { 
    return url.openConnection().getContent(); 
    } 
} 

आपका विधि टाइमआउट पर बाधित हो जाएगा।

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

  • कोई संबंधित समस्या नहीं^_^