2012-04-17 17 views
7

मैं एक निश्चित आकार का थ्रेड पूल बनाना चाहता हूं जो इसकी कतार में कोई कार्य स्वीकार नहीं करता है। दूसरे शब्दों में, यदि थ्रेड पूल वर्तमान में उपयोग में है, तो आने वाले कार्य को अस्वीकार कर दिया जाना चाहिए। documentation के आधार पर, ऐसा करने का एक तरीका, मेरी राय में, एक डमी क्यू ऑब्जेक्ट बनाना होगा जो किसी कार्य को स्वीकार करने से इंकार कर देता है। जावा में इसे पूरा करने के लिए बेवकूफ तरीका क्या है?एक कतार के बिना ThreadPoolExecutor

उत्तर

10

आप अपने थ्रेडपूलएक्सक्टर में SynchronousQueue का उपयोग कर सकते हैं जो एक कतार है जिसमें कोई ऑब्जेक्ट नहीं है। कैश्ड थ्रेड पूल इसका उपयोग करता है क्योंकि यह मांग पर नए धागे बनाता है।

यदि इसे कतारबद्ध नहीं किया जा सकता है, लेकिन मैं मौजूदा थ्रेड में कार्य को चलाने के लिए RejectedExecutionHandler का उपयोग करने का सुझाव दूंगा। इस तरह यह हमेशा "तुरंत" चलाया जाएगा।

बीटीडब्ल्यू: यह स्पष्ट करना उपयोगी होगा कि आप ऐसा क्यों करना चाहते हैं।

0

क्या आप इस बात को विस्तारित कर सकते हैं कि आप ऐसा क्यों करना चाहते हैं? टीपी + क्यू का मूल उद्देश्य काम के लिए एक स्वचालित "होल्डिंग तंत्र" होना है और श्रमिकों को कार्य निर्माण प्रक्रिया से वंचित करना है। यदि आपका इरादा केवल श्रमिकों के रूप में स्वीकार्य कार्य पैकेजों के लिए है तो आपको वास्तव में एक टीपीई की आवश्यकता नहीं है।

+0

इस कार्य को पूर्व के कतार में प्रतीक्षा करने के बजाय, मुक्त थ्रेड के साथ एक और थ्रेड पूल निष्पादक चुना जा सकता है। ThreadPoolExecutor के बजाय मुझे क्या उपयोग करना चाहिए? –

+0

यदि आप निष्पादन को नियंत्रित करना चाहते हैं तो टीपीई आपकी पसंद नहीं है। आप कार्यकर्ता धागे का एक साधारण संग्रह प्राप्त करने से बेहतर होते हैं, जिससे आप नौकरी (यदि वे उपलब्ध हैं) को एक साधारण सेट पर रख सकते हैं, जिसे आप मुख्य थ्रेड से और उसके अंदर से बाहर और बाहर धक्का देते हैं। – vivekv

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