2012-11-20 9 views
6

में थ्रेड की संख्या सीमित करें मैं एक ही समय में निष्पादित किए जा रहे थ्रेड की संख्या को कैसे सीमित कर सकता हूं?ग्रोवी

for(i = 0; i < 100000; i++) { 
    Thread.start { 
     // Do some work 
    } 
} 

मुझे यकीन है कि एक बार अपने आवेदन में धागे की संख्या 100 हिट, एल्गोरिथ्म रुकेगा/app में धागे की संख्या तक इंतजार करना चाहते हैं 100

नीचे चला जाता है: यहाँ मेरी एल्गोरिथ्म के नमूना है

वर्तमान में "कुछ काम" करने में कुछ समय लगता है और मैं अपने ऐप में कुछ हज़ारों धागे के साथ समाप्त होता हूं। आखिरकार यह धागे से बाहर चला जाता है और "कुछ काम" दुर्घटनाग्रस्त हो जाता है। मैं इसे पूल की संख्या सीमित करके इसे ठीक करना चाहता हूं जिसे यह एक समय में उपयोग कर सकता है।

कृपया मुझे बताएं कि मेरी समस्या का समाधान कैसे करें।

उत्तर

10

मुझे विश्वास है कि आप Java Concurrency API में ThreadPoolExecutor ढूंढ रहे हैं। यहां विचार यह है कि आप पूल में अधिकतम थ्रेड को परिभाषित कर सकते हैं और फिर रननेबल के साथ नए थ्रेड को शुरू करने के बजाय, ThreadPoolExecutor थ्रेड के लिए ऊपरी सीमा को प्रबंधित करने का ख्याल रखें।

यहाँ प्रारंभ: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html ThreadBlockingQueue निर्माता के लिए

import java.util.concurrent.*; 
import java.util.*; 

def queue = new ArrayBlockingQueue<Runnable>(50000) 
def tPool = new ThreadPoolExecutor(5, 500, 20, TimeUnit.SECONDS, queue); 

for(i = 0; i < 5000; i++) { 
    tPool.execute { 
     println "Blah" 
    } 
} 

पैरामीटर: corePoolSize (5), इस धागे की # बनाने के लिए और अगर प्रणाली बेकार है बनाए रखने के लिए, धागे की maxPoolSize (500) अधिकतम संख्या बनाने के लिए, 3 और चौथा तर्क बताता है कि पूल को कम से कम 20 सेकंड के लिए निष्क्रिय धागे को रखना चाहिए, और कतार तर्क एक अवरुद्ध कतार है जो कतारबद्ध कार्यों को संग्रहीत करता है।

आप कतार के आकार के साथ क्या खेलना चाहते हैं और अस्वीकृत कार्यों को कैसे संभालना है। यदि आपको 100k कार्यों को निष्पादित करने की आवश्यकता है, तो आपको या तो एक कतार रखना होगा जिसमें 100k कार्य हो सकते हैं, या आपको अस्वीकृत कार्यों को संभालने की रणनीति होनी होगी।

+0

क्या एक छोटा सा उदाहरण प्राप्त करना संभव है? – MeIr

+0

@Melr - मैंने एक उदाहरण जोड़ा, वहां आप जाते हैं। –

+0

आश्चर्यजनक रूप से पर्याप्त है लेकिन उदाहरण के ऊपर Grails में अपेक्षित व्यवहार नहीं करता है :(। उत्तर के लिए धन्यवाद, मुझे लगता है कि मुझे Grails पर्यावरण के लिए विशिष्ट एक और सवाल पूछना पड़ सकता है। – MeIr