2013-02-08 56 views
7

मुझे वर्तमान चल रहे थ्रेड के लिए कुछ निकास कोड इंजेक्ट करने में सक्षम होना चाहिए। ,थ्रेड निकास कॉलबैक

public static void injectThreadExitCallback(final Runnable callback) { 
    final curr = Thread.currentThread(); 
    new Thread() { 
     @Override 
     public void run() { 
      try { 
       curr.join(); 
       callback.run(); 
      } catch (InterruptedException ex) { 
       ... logging ... 
      } 
     } 
    }.start(); 
} 

यह ठीक से काम करने लगता है और मैं वास्तव में क्या चाहते रहा हूँ करता है: मैं थोड़ी देर के लिए यह एक साथ संघर्ष किया है, और मैं अंत में एक समाधान के साथ आया था यहाँ कुछ कोड के लिए मैं क्या कर रहा हूँ के समान है मेरी एकमात्र चिंता यह है कि, यदि यह किसी भी लीकिंग या अन्य अवांछित साइड इफेक्ट्स का कारण बनता है, तो मैं देख नहीं सकता हूं।

या यह बिल्कुल ठीक है, यदि ऐसा है तो यह बहुत उपयोगी है। मैं एक साधारण पुस्तकालय देख सकता था जो मौजूदा धागे में गतिशील रूप से निकास कोड जोड़ सकता है।

+1

ठीक लग रहा है; बस जागरूक रहें कि कॉलबैक एक अलग धागे पर चल रहा है। –

+1

कॉलबैक को 'आखिरकार' ब्लॉक पर ले जाने का अर्थ है कि अगर 'जुड़ने' में कोई अपवाद फेंकता है तो यह तब होगा जब * लक्ष्य थ्रेड से बाहर निकल जाएगा *। इसके अलावा, जब तक कोई बाहरी एजेंट सभी धागे में बाधा डालने शुरू नहीं करता है तब तक शामिल होना कभी अपवाद नहीं फेंक देगा। –

+0

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

उत्तर

3

आप बेहतर कर

new Thread() { 
    @Override 
    public void run() { 
     try 
     { 
      // Thread logic here 
     } 
     finally 
     { 
      // Thread exit logic here 
     } 
    } 
}.start(); 
+1

अच्छा बिंदु! इस तरह अगर मैं जिस थ्रेड को लपेट रहा हूं, वह बीमार हो जाता है, फिर भी मुझे वह करने की ज़रूरत है जो मुझे करने की ज़रूरत है। –

+0

यह बिल्कुल इंजेक्शन नहीं है, है ना? धागा निकास तर्क को शामिल करने के लिए थ्रेड कोड को संशोधित करने की आवश्यकता है। (या आप OP के सुझाए गए व्यवहार इंजेक्शन थ्रेड को पुनर्गठन के बारे में बात कर रहे हैं? –

+0

मुझे लगता है कि वह कह रहा था कि मुझे अपवादों के मामले में मेरी कॉलबैक को स्थानांतरित करने की आवश्यकता है, मुझे लगता है। –

0

आप catch ब्लॉक के बाद या final ब्लॉक में callback.run(); स्थानांतरित कर सकते हैं, तो आप यह सुनिश्चित करना है कि यह वैसे भी

+0

आम तौर पर, थ्रेड को बाधित करने का एकमात्र कारण यह है कि वह ऐसा करने से रोकने के लिए है जो यह कर रहा है। इस मामले में, केवल एक चीज जो कॉल कर रही है वह कॉलबैक का आह्वान करने का इंतजार कर रही है। इस प्रकार, आप निश्चित रूप से यह सुनिश्चित करना चाहते हैं कि थ्रेड बाधित होने पर कॉलबैक लागू किया जाए! –

+0

यह सच है, लेकिन यह एप्लिकेशन लॉजिक मौसम पर निर्भर करता है, जिसे आप सुनिश्चित करना चाहते हैं कि 'कॉलबैक' कहा जाता है या नहीं। तो उदाहरण के लिए, यदि 'कॉलबैक' कुछ सफाई कार्य कर रहा है, तो आपके पास यह सुनिश्चित करने का एक वैध कारण होगा कि थ्रेड बाधित होने पर भी इसे बुलाया जाता है। – iTech

2

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

आपका डिज़ाइन डेटा रेस को उस कोड में पेश कर सकता है जो पहले एकल थ्रेडेड था और इस प्रकार कोई सहमति नहीं थी।

अंत में, डिज़ाइन एक बहुमूल्य सिस्टम संसाधन (थ्रेड) को कुछ भी करने के लिए बर्बाद नहीं करता है लेकिन एक और थ्रेड समाप्त होने की प्रतीक्षा करता है।

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