2016-02-11 12 views
5

से खारिज कर दिया गया है मेरे पास ThreadPoolExecutor है और मैं इसे एक कार्य सबमिट करता हूं।भविष्य कार्य ThreadPoolExecutor

private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1)); 

इस कोड ThreadPoolExecutor करने के लिए Runnable सबमिट करता है।

protected void waitAndSweep(final String symbol) { 

    runnable = new Runnable() { 
     public void run() { /* irrelevant code */ } 
    }; 

    try { 
     Future<?> self = threadPoolExecutor.submit(runnable); 
     futures.add(self); 
    } catch (RejectedExecutionException re) { 
     /* this exception will be thrown when wait and sweep is called more than twice. 
     * threadPoolExecutor can have one running task and one waiting task. 
     */ 
    } catch (Exception e) { 
     logEvent(StrategyEntry.ERROR, "waitAndSweep", symbol, "Exception caught...", e); 
    } 
    } 

निम्न कोड कार्य रोकता है।

protected synchronized void stop(StrategyEntry entry) throws Exception { 
    for (Object future : futures) { 
     ((Future<?>) future).cancel(true); 
    } 
    futures.clear(); 

    threadPoolExecutor.shutdown(); 
} 

समस्या यहाँ है:

टास्क [email protected] java.util.concurrent से अस्वीकार कर दिया: जब मैं काम को रोकने की कोशिश, मैं निम्नलिखित अपवाद हो रही है। ThreadPoolExecutor @ 216393fb [समाप्त, पूल आकार = 0, सक्रिय सूत्र = 0, पंक्तिबद्ध कार्य = 0, पूर्ण कार्य = 1]

+0

क्या आप इस निष्पादक पर कहीं भी 'शटडाउन()' कहते हैं? – RAnders00

+0

हाँ स्टॉप विधि – MMPgm

+0

आप क्षमता 1 के साथ एक बैकिंग कतार बना रहे हैं - क्या वहां कुछ और कार्य पहले से मौजूद है? –

उत्तर

5

समस्या यह है कि आप shutdown() रोक विधि में excutor। यदि आप कार्य को पूरा करने के लिए बस प्रतीक्षा करना चाहते हैं, तो Future.get() का उपयोग करें। जब कोई निष्पादक बंद हो जाता है, तो कार्यों को अब सबमिट नहीं किया जा सकता है।

shutdown() केवल तभी उपयोग किया जाना चाहिए जब आप वास्तव में एप्लिकेशन को समाप्त करना चाहते हैं।

+0

जब निष्पादक बंद हो जाता है, तो मैं नहीं चाहता कि कोई नया कार्य सबमिट किया जाए – MMPgm

+0

@MMPgm आपके प्रश्न से, यह पूरी तरह स्पष्ट नहीं है कि आप 'स्टॉप() की अपेक्षा करते हैं वास्तव में करने के लिए विधि। शायद आप इसे स्पष्ट कर सकते हैं? – RAnders00

+0

स्टॉप विधि को सभी प्रतीक्षा कार्य को मारना चाहिए और इसे किसी अन्य कार्य को स्वीकार नहीं करना चाहिए। मैं सिर्फ यह जानना चाहता था कि अपवाद के लिए संभावित मामला क्या है। – MMPgm

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