मैं धागे की श्रृंखला से परिणामों को संसाधित करने के लिए एक पूर्ण सेवा सेवा का उपयोग करना चाहता हूं क्योंकि वे पूरा कर चुके हैं। मैं एक पाश भविष्य जाने वाली वस्तुओं को प्रदान करता है के रूप में वे उपलब्ध हो जाते हैं लेने के लिए सेवा है, लेकिन मैं यह निर्धारित करने के लिए जब सभी धागे पूरा कर लिया है सबसे अच्छा तरीका है पता नहीं है (और इस प्रकार पाश बाहर निकलने के लिए):कैसे पता चलेगा कि एक पूरा सेवा कब समाप्त हो रही है?
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
public class Bar {
final static int MAX_THREADS = 4;
final static int TOTAL_THREADS = 20;
public static void main(String[] args) throws Exception{
final ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(MAX_THREADS);
final CompletionService<Integer> service = new ExecutorCompletionService<Integer>(threadPool);
for (int i=0; i<TOTAL_THREADS; i++){
service.submit(new MyCallable(i));
}
int finished = 0;
Future<Integer> future = null;
do{
future = service.take();
int result = future.get();
System.out.println(" took: " + result);
finished++;
}while(finished < TOTAL_THREADS);
System.out.println("Shutting down");
threadPool.shutdown();
}
public static class MyCallable implements Callable<Integer>{
final int id;
public MyCallable(int id){
this.id = id;
System.out.println("Submitting: " + id);
}
@Override
public Integer call() throws Exception {
Thread.sleep(1000);
System.out.println("finished: " + id);
return id;
}
}
}
मैंने ThreadPoolExecutor की स्थिति की जांच करने का प्रयास किया है, लेकिन मुझे पता है कि getCompletedTaskCount प्राप्त करें और GetTaskCount विधियां केवल अनुमान हैं और इन पर भरोसा नहीं किया जाना चाहिए। क्या यह सुनिश्चित करने का एक बेहतर तरीका है कि मैंने खुद को गिनने की तुलना में CompletionService से सभी वायदा पुनर्प्राप्त किए हैं?
संपादित करें: दोनों लिंक कि Nobeh प्रदान की, और this link का सुझाव है कि, प्रस्तुत कार्यों की संख्या की गणना फिर टेक बुला() कि कई बार, जाने के लिए रास्ता है। मुझे आश्चर्य है कि CompletionService या उसके निष्पादक से पूछने का कोई तरीका नहीं है कि वापस आने के लिए क्या छोड़ा गया है।
धन्यवाद, nobeh। ऐसा लगता है कि वे थ्रेड गिनती पर भी लूप करते हैं, उनके लिए "int (int कार्यों हैंडल = 0; कार्यों हैंडल <सबमिट टास्क; कार्य हैंडल ++)" लूप। मैं बस सोच रहा था कि क्या समवर्ती एपीआई में कुछ और सूक्ष्म है जो मुझे उपयोग करना चाहिए। –
एपीआई में उदाहरण पंक्ति में() n बार निष्पादित करने के समान दृष्टिकोण का उपयोग करता है। http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorCompletionService.html –
यदि एक्सेक्टर को कार्यों को सबमिट किए गए कार्यों की तुलना में किसी भिन्न थ्रेड में CompletionService से परिणाम लेते हैं, तो क्या यह थ्रेड सुरक्षित है? – raffian