2012-10-15 18 views
9

हाथ में निम्नलिखित कोड होने से:ExecutorService

ExecutorService executor = Executors.newFixedThreadPool(10); 
    Collection collection = new ArrayList(); 
    for (int n=1; n<100; n++) 
     collection.add(new MyThread(n)); 

    try { 
     List<Future<Boolean>> futures = executor.invokeAll(collection); 

     for(Future<Boolean> future : futures){ 
      future.get(); 
      if (future.isDone()) { 
       System.out.println("true"); 
      } 
      else 
       System.out.println("false"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

यदि उपरोक्त सही है?
और यदि सभी future.isDone() सत्य हैं, तो सभी धागे किए गए हैं?
यह सुनिश्चित करने के लिए कि मैं उन सभी को कैसे कर सकता हूं, मैं ध्वज कैसे बना सकता हूं?

उत्तर

7

मार डाला गया है के बाद की जांच मान से जाँच तो फिर जांच करने के लिए सभी सच्चे हैं, तो आप कुछ इस तरह कर सकते हैं यदि:

boolean works=true; 
    for(Future<Boolean> future : futures){ 
     future.get(); 
     if (future.isDone()) { 
      System.out.println("true"); 
     } 
     else{ 
      System.out.println("false");works=false; 
     } 
    } 
if(works)System.out.println("yea it works") 
0

यदि विधि future.get लौटाती है तो भविष्य द्वारा की गई गणना पूरी हो जाती है, इसलिए isDone पर कॉल करना अनावश्यक है। और हां, सभी वायदा समाप्त होने के बाद ThreadPool में सभी धागे उपलब्ध हो सकते हैं।

+0

तो मैं इस हिस्से को हटा सकते हैं के पूरा होने की जांच करने के जबकि? अगर (भविष्य .isDone()) { System.out.println ("सत्य"); } अन्य { System.out।println ("झूठे"); } – fen1ksss

+0

मुझे ऐसा लगता है। 'Javadoc] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html#get())' भविष्य 'के लिए कहता है कि' प्राप्त करें '' यदि आवश्यक हो तो प्रतीक्षा करें गणना पूर्ण करने के लिए, और फिर इसके परिणाम को पुनर्प्राप्त करता है। " तो वास्तव में आपको अपने अपवाद हैंडलर में 'isDone' को लपेटने की भी आवश्यकता है। – vainolo

2

आम तौर पर आप थ्रेड पूल में रननेबल कार्य जोड़ते हैं। थ्रेड पूल में थ्रेड जोड़ना जो आपको लगता है वह करने वाला नहीं है।

जब भविष्य में .get() प्रत्येक कार्य के लिए लौटाता है, तो सभी कार्य पूरा हो जाते हैं। कार्यों को चलाने वाले थ्रेड अभी भी चल रहे होंगे।

आप सभी धागा बंद करना चाहते हैं एक बार कार्य पूरा कर लिया है आप executor.shutdown(); और executor.awaitTermination


तरह से उपयोग कर सकते हैं मैं इसे

ExecutorService executor = Executors.newFixedThreadPool(10); 
List<Future<Boolean>> futures = new ArrayList<>(); 
for (int n = 0; n < 100; n++) 
    futures .add(executor.submit(new MyTask(n)); 

for(Future<Boolean> future : futures) { 
    boolean result = future.get(); 
    // do something with the result. 
} 

है परिणाम की जरूरत नहीं है, तो लिखते थे आप Future<Void> या Future<?> या सिर्फ Future

+0

यदि यह नहीं है कि मैं क्या सोचता हूं, तो मैं कैसे सुनिश्चित कर सकता हूं कि सभी धागे किए गए हैं? – fen1ksss

+0

आप थ्रेड पूल में * कार्य * जोड़ते हैं, * नहीं * धागे के रूप में थ्रेड पूल में पहले से ही धागे हैं। यदि आप थ्रेड पूल में थ्रेड जोड़ते हैं तो यह 'प्रारंभ()' भी नहीं होगा क्योंकि यह रननेबल की अपेक्षा कर रहा है। –

+0

MyThread सिर्फ एक वर्ग है, यह – fen1ksss

1

प्रारंभ करें साथ मूल्य = 1 और बाकी में मान को अद्यतन एक चर जांच पाश

 if (future.isDone()) { 
      System.out.println("true"); 
     } 
     else 
      {System.out.println("false"); 
      check=0;} 
2

एक बुलियन चर का उपयोग करना यह समझने का सबसे आसान तरीका है कि सभी धागे किए जाते हैं। एक और तरीका एक आदिम का उपयोग कर सकता है, उदा। पूर्णांक। यह देखने के लिए कि क्या सभी धागे किए गए हैं, आप काउंटर को बढ़ा सकते हैं/घटा सकते हैं।

और दूसरा तरीका ऑब्जेक्ट पर awaitTermination() आमंत्रण के वापसी मूल्य की जांच कर सकता है।

int counter = 0; 

    for(Future<Boolean> future : futures) 
    { 
     future.get();    
     if (future.isDone()) 
      System.out.println("true"); 
     else 
     { 
      counter++; 
      System.out.println("false"); 
     } 
    } 

    if(counter != 0) 
     System.out.println("DONE!"); 

    // Another way of checking all threads are done. 
    if(executor.awaitTermination(100, TimeUnit.SECONDS)) 
     System.out.println("DONE!"); 
+0

एक ही समय में .get और .isDone का उपयोग करने के लिए आवश्यक है? यदि नहीं, तो मेरे प्रश्न के लिए कौन सा बेहतर है? – fen1ksss

+0

@ fen1ksss प्राप्त करें और किया गया है विभिन्न विधियां हैं। तो यह पूछने के लिए बकवास है "मेरे प्रश्न के लिए कौन सा बेहतर है?"। जिस तरह से आप इन विधियों का उपयोग करते हैं, ठीक है, मुझे लगता है। – Juvanis

+0

ठीक है, धन्यवाद – fen1ksss

16

vainolo के जवाब पर टिप्पणी के रूप मायने रखता था, लेकिन मैं काफी प्रतिष्ठा अंक नहीं हैं:

isDone क्योंकि invokeAll वायदा की एक सूची है जिसके लिए isDone सच है रिटर्न भी बेमानी है। जावाडॉक्स mention this

+1

यह मेरी राय में सबसे अच्छा जवाब है। स्पष्टीकरण के लिए, invoke सभी काम पूरा होने तक वापस नहीं आते हैं, यह अवरुद्ध है। (ओवरलोड हैं जो अवरुद्ध नहीं हैं) – Konstantin

0

Invokeall इस विधि बुला इंतजार कर रहा है पूरा सभी तो ले सीपीयू निष्पादन पाश पूरा होने के लिए जाँच करने के लिए करने के लिए पहुंचता है या हम क्या जरूरत है .. पाश कार्यों

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