2010-11-13 11 views
7

मैं जावा में एक बहुप्रचारित प्रोग्राम लिख रहा हूं। मैं इसजावा थ्रेड्स में अस्वीकृत एक्सेक्यूशन अपवाद

exec.execute(p) // where p is a runnable task working on an array 
print array 
exec.shutdown 

समस्या का सामना करना पड़ रहा है कि सरणी सही उत्पादन दे रही है मुद्रित हो जाता है, लेकिन फिर खारिज कर दिया निष्पादन अपवाद आता मुझे समझ नहीं आता क्यों जब धागे संसाधित और दे दिया है है की तरह कुछ लिखा है सही आउटपुट क्यों त्रुटि आ रही है ...

+1

RejectedExecutionException फेंक दिया जाता है प्रयोग किया जाता है "जब एक कार्य नहीं किया जा सकता निष्पादन के लिए स्वीकार किया गया। " यह संभव है कि आपके नियंत्रण प्रवाह में आपको एक साधारण त्रुटि हो, इसलिए मैं आपको सुझाव देता हूं कि कृपया हमें कुछ कोड दिखाएं। –

+0

इसके अलावा, आप 'निष्पादक' के किस विशिष्ट कार्यान्वयन का उपयोग कर रहे हैं? –

उत्तर

13

मुझे लगता है कि आप अपने निष्पादक को बहुत जल्दी बंद कर रहे हैं। यह एक उदाहरण है कि मुझे लगता है कि आपको काम करना चाहिए।

public class Main { 
    public static void main(String[] args) throws Exception { 

     // the array to modify 
     final int[] array = new int[1000]; 

     // start the executor (that modifies the array) 
     ExecutorService executor = Executors.newFixedThreadPool(10); 

     for (int i = 0; i < 1000; i++) { 
      final int c = i; 
      executor.execute(new Runnable() { 
       @Override 
       public void run() { 
        array[c] = c; 
       } 
      }); 
     } 

     // wait for all tasks to quit 
     executor.shutdown(); 
     while (!executor.awaitTermination(10, TimeUnit.SECONDS)); 

     // print the array 
     System.out.println(Arrays.toString(array)); 
    } 
} 

भी ध्यान रखें कि एक ही समय में एक ही सरणी पर काम कर विसंगति कारण बन सकता है - क्या तुम सच में विश्वास है कि आप सरणी सरणी पर निर्भर करता है पर काम नहीं कर रहे हैं होना चाहिए।

+3

execorService.shutdown() कार्यों को बंद करने की प्रतीक्षा नहीं करता है, यह केवल निष्पादक सेवा को किसी और कार्य को स्वीकार नहीं करने और समाप्त करने के लिए कहता है। ExecutorService.awaitTermination() जब तक कार्य समाप्त कर दिया है बुला धागा ब्लॉक करने के लिए बंद करने के लिए कॉल() के बाद बुलाया जाना चाहिए। – Rich

+0

अच्छा बिंदु! अपडेट किया गया – dacwe

+0

मेरा मानना ​​है कि 'के रूप में executor.awaitTermination' ब्लॉक में ही (?) – IHeartAndroid

0

एक और विकल्प है जब आप निष्पादक के लिए और फिर मिल

6

समस्या आप अभी भी भी shutdown() बुला के बाद नए कार्य सबमिट कर रहे है फोन करके भविष्य पर ब्लॉक प्रस्तुत भविष्य प्राप्त हो सकता है। तो executor.awaitTermination() का उपयोग करने में मदद नहीं मिलेगी।

समस्या को ठीक करने के लिए, कार्य सबमिट करने के समय wheather निष्पादक को बंद नहीं किया गया है।

उदाहरण:

if (!executor.isShutdown()) 
{ 
    executor.execute(new Runnable() { 
         @Override 
         public void run() { 
           array[c] = c; 
         } 
        }); 
} 

आशा है कि यह मदद करता है ...

+0

मेरे मामले में निष्पादक अगर और निष्पादित लाइनों के बीच वास्तव में बंद कर दिया गया। तो अगर वहाँ संगामिति शामिल है आप निष्पादित() और शट डाउन() डाल करने के लिए सिंक्रनाइज़ ब्लॉक/तरीकों में कॉल की जरूरत है। –

2

मैं बंद करने के लिए क्रम बंद हुक में बनाया निष्पादकों

Runtime.getRuntime().addShutdownHook(new Thread() { 

      public void run() { 
      if(!eExecutor.isShutdown()) { 
       eExecutor.shutdown(); 
       // await termination code 
       } 
      } 

     }); 
संबंधित मुद्दे