2010-06-08 28 views
5

क्वार्ट्ज शेड्यूलर के साथ भेजे गए SimpleThreadPool क्लास में फीफो व्यवहार नहीं है। मैं यह सुनिश्चित करना चाहता हूं कि यदि मैं शेड्यूलर में नौकरियां जोड़ता रहता हूं, तो उन्हें पहले-इन-फर्स्ट-आउट आधार पर संबोधित किया जाता है। क्या इसके लिए कोई थ्रेडपूल उपलब्ध है? या यह हासिल करने का कोई और तरीका है?क्वार्ट्ज शेड्यूलर थाडपूल

उत्तर

5

आप इस प्रकार, एक फीफो कतार के साथ एक ThreadPoolExecutor को सौंपने के द्वारा इस लक्ष्य को हासिल कर सकते हैं:

public class DelegatingThreadPool implements ThreadPool { 

private int size = 5; //Fix this up if you like 
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(size, size, 
            0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 

public boolean runInThread(Runnable runnable) { 
    synchronized (executor) { 
     if (executor.getActiveCount() == size) { 
      return false; 
     } 
     executor.submit(runnable); 
     return true; 
    } 
} 

public int blockForAvailableThreads() { 
    synchronized (executor) { 
     return executor.getActiveCount(); 
    } 
} 

public void initialize() throws SchedulerConfigException { 
    //noop 
} 

public void shutdown(boolean waitForJobsToComplete) { 
    //No impl provided for wait, write one if you like 
    executor.shutdownNow(); 
} 

public int getPoolSize() { 
    return size; 
} 

public void setInstanceId(String schedInstId) { 
    //Do what you like here 
} 

public void setInstanceName(String schedName) { 
    //Do what you like here 
} 

ऐसा नहीं है कि निष्पादनयोग्य के सक्रिय गिनती बिल्कुल कार्यों को क्रियान्वित कर रहे हैं की सही संख्या से मेल नहीं खाएगी संभव है। सुनिश्चित करने के लिए आपको एक लच जोड़ने और पहले एक्सेक्यूट का उपयोग करने की आवश्यकता होगी, यदि यह आवश्यक हो तो कार्य चलाना शुरू हो गया है।

+0

यह एक अच्छा उदाहरण है, मैं इसे आजमाउंगा। – Shamik

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