2010-03-17 13 views
6

यह example से कुछ नमूना कोड है। मुझे क्या पता होना चाहिए कि call() कॉल करने योग्य कहलाता है? क्या ट्रिगर करता है?कॉल करने योग्य ऑब्जेक्ट्स का उपयोग कर जावा एक्जिक्यूटर में कॉल() विधि कब कॉल की जाती है?

public class CallableExample { 

public static class WordLengthCallable 
    implements Callable { 
    private String word; 
    public WordLengthCallable(String word) { 
     this.word = word; 
    } 
    public Integer call() { 
     return Integer.valueOf(word.length()); 
    } 
} 

public static void main(String args[]) throws Exception { 
    ExecutorService pool = Executors.newFixedThreadPool(3); 
    Set<Future<Integer>> set = new HashSet<Future<Integer>>(); 
    for (String word: args) { 
     Callable<Integer> callable = new WordLengthCallable(word); 
     Future<Integer> future = pool.submit(callable); //**DOES THIS CALL call()?** 
     set.add(future); 
    } 
    int sum = 0; 
    for (Future<Integer> future : set) { 
     sum += future.get();//**OR DOES THIS CALL call()?** 
    } 
    System.out.printf("The sum of lengths is %s%n", sum); 
    System.exit(sum); 
    } 
} 

उत्तर

9

एक बार जब आप submitted प्रतिदेय है, निष्पादक निष्पादन के लिए प्रतिदेय निर्धारित करेगा। निष्पादक के आधार पर यह सीधे हो सकता है या धागा उपलब्ध हो जाने पर।

दूसरी तरफ get कॉलिंग केवल गणना के परिणाम को पुनर्प्राप्त करने का इंतजार कर रही है।

तो सटीक होना: कहीं भी submit के बीच में कॉल किया जा रहा है और get पर कॉल करने के लिए कॉल करने योग्य कॉल करने योग्य कहा जाता है।

3

Executor का उपयोग करने का पूरा विचार यह है कि आपको पर ध्यान नहीं देना चाहिए जब विधि विधि कहा जाता है।

सामान्य रूप से गारंटी की जाने वाली एकमात्र चीज यह है कि रिटर्न के get() पर विधि निष्पादित की जाएगी।

जब इसे ठीक कहा जाएगा, तो आप Executor पर निर्भर करते हैं। उदाहरण के लिए उपयोग किए गए निश्चित थ्रेड पूल के साथ, call() विधि को फ्री थ्रेड के रूप में जल्द ही बुलाया जाएगा और कतार में दिए गए कार्य के सामने कोई अन्य कार्य नहीं है (इसलिए जब तक पर्याप्त कार्य हो, आप आपके उदाहरण में किसी भी समय दिए गए 3 call() विधि कॉल चलेंगे)।

+0

मैं धागे में पूर्वानुमान लगाना कठिन समय उपलब्ध बनने के बारे में मुद्दे को समझने, मैं होना चाहिए पूछा गया कि 'कब कॉल करने योग्य ** ** निर्धारित होगा **' - जब तक यह * सबमिट() * पर निर्धारित हो जाता है तब मुझे यह जानने की ज़रूरत है :) – MalcomTucker

+0

@ मैल्कॉम: मुझे नहीं लगता कि यह बेहतर होगा प्रश्न, चूंकि शेड्यूलिंग प्रोग्राम के लिए दृश्यमान/देखने योग्य नहीं है, इसलिए बाद में निर्धारित होने पर क्या बदल जाएगा? –

0

जवाब "जब एक प्रतिदेय कार्यक्रम होगा" करने के लिए java.util.concurrent.ThreadPoolExecutor # में निहित है कार्यान्वयन (डिफ़ॉल्ट) पर अमल

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