2009-06-13 16 views
7

मेरे पास एक ऐसा एप्लिकेशन है जो एक नए थ्रेड को जन्म देता है जब उपयोगकर्ता किसी छवि को फ़िल्टर करने के लिए कहता है।सरल थ्रेड प्रबंधन - जावा - एंड्रॉइड

यह एकमात्र प्रकार का कार्य है जो मेरे पास है और सभी समान महत्व के हैं।

यदि मैं बहुत अधिक समवर्ती धागे (मैक्स मैं कभी चाहता हूं 9) के लिए पूछता हूं तो थ्रेड मैनेजर अस्वीकृत एक्सेक्यूशन अपवाद फेंकता है।

मिनट में मैं क्या करता हूं;

// Manage Concurrent Tasks 
private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer>>(); 

@Override 
public int remainingSize() { 
    return tasks.size(); 
} 

@Override 
public void addTask(AsyncTask<Bitmap, Integer, Integer> task) { 
    try{ 
     task.execute(currentThumbnail); 
     while(!tasks.isEmpty()){ 
      task = tasks.remove(); 
      task.execute(currentThumbnail); 
     } 
    } catch (RejectedExecutionException r){ 
     Log.i(TAG,"Caught RejectedExecutionException Exception - Adding task to Queue"); 
     tasks.add(task); 
    } 
} 

बस एक कतार में अस्वीकार कर दिया कार्य जोड़ सकते हैं और अगली बार जब एक धागा कतार शुरू कर दिया है बैकलॉग हो, तो देखने के लिए जाँच की है।

इसके साथ स्पष्ट मुद्दा यह है कि यदि अंतिम कार्य अपने पहले प्रयास पर खारिज कर दिया जाता है तो इसे कभी भी पुनरारंभ नहीं किया जाएगा (जब तक इसकी आवश्यकता नहीं होती है)।

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

सधन्यवाद,

गेविन

उत्तर

12

RejectedExecutionException का कारण यह है कि AsyncTask अपने स्वयं के थ्रेड पूल (प्रति श्री मार्टेलि के उत्तर) को लागू करता है, लेकिन अधिकतम 10 एक साथ कार्यों में कैप्चर किया जाता है। उनके पास वह सीमा क्यों है, मुझे कोई जानकारी नहीं है।

इसलिए, AsyncTask क्लोन करने के लिए एक संभावना है, सीमा बढ़ाएं (या बिना बढ़ाए जाएं, LinkedBlockingQueue के साथ भी संभव है), और अपने क्लोन का उपयोग करें। फिर, शायद भविष्य में एंड्रॉइड रिलीज के लिए AsyncTask पर एक पैच के रूप में परिवर्तन सबमिट करें।

पर क्लिक करें AsyncTask के लिए Google Code Search चलाने के लिए - पहली हिट कार्यान्वयन होनी चाहिए।

यदि आप केवल सीमा को उठाना चाहते हैं, तो MAXIMUM_POOL_SIZE को जितनी बड़ी आवश्यकता हो उतनी बड़ी समायोजित करें। यदि आप असंबद्ध जाना चाहते हैं, तो वर्तमान में उपयोग किए जाने वाले बजाय शून्य-तर्क LinkedBlockingQueue कन्स्ट्रक्टर का उपयोग करें। AFAICT, शेष कोड शायद वही रहता है।

+15

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

+0

सीमा वर्तमान में 5google.com/codesearch#uX1GffpyOZk/core/java/android/os/AsyncTask.java –

+0

@Grantland Chew के अनुसार 5 समांतर धागे है: नहीं, यह 5 प्रारंभ करने के लिए है। यह उससे आगे बढ़ सकता है। – CommonsWare

3

आप Thread Pool डिजाइन पैटर्न के एक संस्करण को लागू किया है लगते हैं। मैं this Java-specific article की भी सिफारिश करता हूं जिसमें स्पष्ट कोड और स्पष्टीकरण है।

0

शायद एक विकल्प है कि कार्य को पैरामीटर के रूप में बिटमैप लेने के बजाय ब्लॉकिंग कतार (बिटमैप्स के) पर प्रतीक्षा करें, लेकिन आपको कार्य को समाप्त करने के लिए एक तरीका जोड़ना होगा।

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