2012-12-18 28 views
7

पर सबमिट किए गए एक रननेबल को रोकें मैंने अपने जावा ऐप में सदस्यता लागू की है। जब नए ग्राहक जोड़े, आवेदन नया कार्य (कक्षा जो Runnable लागू करता है अलग थ्रेड में चलाने के लिए) है और यह ExecutorService तरह से जोड़ा जाता है बनाता है:निष्पादक सेवा

public void Subscribe() 
{ 
    es_.execute(new Subscriber(this, queueName, handler)); 
} 

//... 

private ExecutorService es_; 

आवेदन पंजीकृत कर सकते हैं के रूप में कई ग्राहकों के रूप में आप चाहते हैं। अब मैं Unsubscribe जैसे कुछ कार्यान्वित करना चाहता हूं ताकि प्रत्येक ग्राहक के पास संदेश प्रवाह को रोकने की क्षमता हो। यहां मुझे ExecutorService में चल रहे कार्यों में से किसी एक को रोकने के लिए एक तरीका चाहिए। लेकिन मुझे नहीं पता कि मैं यह कैसे कर सकता हूं।

ExecutorService.shutdown() और इसकी विविधताएं मेरे लिए नहीं हैं: वे सभी कार्यों को समाप्त कर देते हैं, मैं बस उनमें से एक को समाप्त करना चाहता हूं। मैं एक समाधान की तलाश में हूं। यथासंभव सरल। धन्यवाद।

उत्तर

8

आप execute के बजाय ExecutorService#submit का उपयोग करें और कोशिश करते हैं और Future#cancel

उदाहरण का उपयोग करते हुए कार्य को रद्द करने के लिए लौट Future वस्तु का उपयोग कर सकते हैं (यह मानते हुए Subscriber एक Runnable है):

Future<?> future = es_.submit(new Subscriber(this, queueName, handler)); 
... 
future.cancel(true); // true to interrupt if running 

महत्वपूर्ण नोट टिप्पणियों से:

If your task doesn't honour interrupts and it has already started, it will run to completion.

+0

यह होगा उपयोगी उदाहरण जोड़ने के लिए आप अपना उत्तर संपादित करते हैं तो सहायक। मैं दस्तावेज़ीकरण और Google में सभी चीजें पा सकता हूं, लेकिन उत्तर केवल मेरे लिए नहीं बल्कि दूसरों के लिए भी हैं। यह कुछ (अमूल्य) समय बचा सकता है। – maverik

+0

यहां आप जाते हैं, सरल उदाहरण –

+0

धन्यवाद। यह वास्तव में सहायक है। – maverik

3

ExecutorService.execute(Runnable) का उपयोग करने के बजाय Future<?> submit(Runnable) का उपयोग करने का प्रयास करें। यह विधि निष्पादन के लिए पूल में Runnable सबमिट करेगी और यह Future ऑब्जेक्ट लौटाएगी। ऐसा करके आप सभी ग्राहक धागे के संदर्भ होंगे।

विशेष धागा को रोकने के लिए बस futureObj.cancel(true) का उपयोग करें। यह InterruptedException फेंकने, चल रहे थ्रेड को बाधित करेगा। ग्राहक धागे को इस तरह के कोड के रूप में संसाधित करना बंद कर दिया जाना चाहिए (उदाहरण के लिए Thread.sleep(millis) पूरे विधि के लिए रैपर प्रयास/पकड़ ब्लॉक के साथ)।

आप सरकारी एपीआई पर अधिक जानकारी प्राप्त cand: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html