2009-11-05 25 views
8

मैं दो थ्रेड को मुख्य थ्रेड से कॉल कर रहा हूं, उन्हें थ्रेड 1 और थ्रेड 2 कहें। जब थ्रेड 1 बंद हो जाता है, तो मैं थ्रेड 2 को रोकना या मारना चाहता हूं। मैं यह कैसे कर सकता हूं? वास्तविक आउटपुट में एक बदलाव है जो मैं चाहता हूं। यही एक मुख्य वर्ग है जो धागा भी है। मुख्य वर्ग से मैं थ्रेड 1 और थ्रेड 2 को कॉल कर रहा हूं। मैं मुख्य वर्ग से थ्रेड 1 में इनपुट दे रहा हूं लेकिन जब यह इनपुट बदल रहा है, तो मैं चल रहे थ्रेड 1 को मारना चाहता हूं और इसे एक बार फिर एक और इनपुट के साथ शुरू करना चाहता हूं। दूसरा थ्रेड, थ्रेड 2 थ्रेड 1 द्वारा दिए गए आउटपुट के साथ चलाएगा। आखिरकार जब पहला धागा मारे जाए तो दूसरा चल रहा होगा लेकिन केवल तभी आउटपुट देगा जब t6here उस थ्रेड के लिए इनपुट हो।मैं जावा में किसी अन्य धागे से धागे को कैसे मारूं?

उत्तर

13

जावा स्पष्ट रूप से एक और धागा मारने के लिए तरीकों का त्याग दिया है (Thread.stop/Thread.destroy की तरह)। सही तरीका यह सुनिश्चित करना है कि अन्य थ्रेड पर संचालन रोकने के लिए कहा जा रहा है (उदाहरण के लिए, वे एक इंटरप्टेड एक्सेप्शन की अपेक्षा करते हैं, जिसका अर्थ है कि आप इसे रोकने के लिए Thread.interrupt() को कॉल कर सकते हैं)।

आप दूसरे धागे को daemon thread के रूप में सेट करने में भी रुचि रखते हैं, जिसका अर्थ है कि यदि वीएम में अन्य सभी धागे समाप्त हो गए हैं तो प्रक्रिया बाहर निकल जाएगी।

2

these instructions के अनुसार, यह झंडा चर का उपयोग करने के लिए अपने काम सफाई से रोकने के लिए अन्य धागा बताने के लिए सबसे अच्छा है।

+0

थैंक्स सुझाव के लिए बहुत कुछ है लेकिन आप इसे ठीक से निर्दिष्ट करने में मेरी सहायता करते हैं। – Raji

6

कैसे नीचे धागे सफाई से बंद करने के लिए पर this Java Specialist article देखें।

संक्षेप में, आलेख Thread.interrupt() प्लस उचित InterruptedException थ्रेड कोड में हैंडलिंग की सिफारिश करता है। यह अपने आप में एक दिलचस्प चर्चा है, और कुछ ऐसा जो मैंने शायद ही कभी सही तरीके से किया है।

+1

यह लेख किसी भी व्यक्ति को पढ़ने और अनुशंसित किया गया है जिसमें जावा – abyx

1

run() अपने धागे की विधि में, shutdown() जैसे एक्सेसर विधि के माध्यम से सेट की गई विशेषता को जांचें, जब आप थ्रेड को रोकना चाहते हैं, तो उस मान का उपयोग लूप को समाप्त करने के लिए करें। उदाहरण के लिए:

boolean stopping = false; 

Thread currentThread = null; 

public void run() { 

    currentThread = Thread.currentThread(); 

    while (!isStopping()) { 

     // do something, sleep a while 
    } 
} 

public synchronized void shutdown() { 

    stopping = true; 

    currentThread.notifyAll(); 
} 

public synchronized boolean isStopping() { 

    return stopping; 
} 
+0

में डौग ली के समवर्ती प्रोग्रामिंग को पढ़ने के लिए पर्याप्त समय नहीं है आपके कोड में रेस स्थिति है और सिंक्रनाइज़ेशन का आपका उपयोग खराब है। वर्तमान धागे की बाधित स्थिति को जांचना या यदि आपको किसी प्रकार के सेंटीनेल का उपयोग करना चाहिए, तो कम से कम इसे परमाणु बनाना चाहिए। – Kevin

+0

@ केविन, आपको * याद आना चाहिए * उदाहरण के लिए, बिट, यह कोड स्पष्ट रूप से केवल एक समाधान की संरचना दिखाने के लिए है - जैसा कि उपयोग नहीं किया जाना चाहिए। – rsp

+1

@rsp: यदि आप उदाहरण पोस्ट करते हैं, तो उन्हें अच्छे उदाहरण बनाएं। यदि लोग पहले से ही बुरे उदाहरणों से भेद करना चाहते थे, तो उन्हें यहां पूछना नहीं होगा। –

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