मैं यह समझने की कोशिश कर रहा हूं कि Callable
एक अलग थ्रेड पर चलने पर मान वापस करने में सक्षम है।हुड के नीचे एक कॉल करने योग्य काम कैसे करता है? कॉल करने योग्य ऑब्जेक्ट के लिए मूल्य वापस करने के लिए यह कैसे संभव है?
मैं वर्गों Executors
, AbstractExecutorService
, ThreadPoolExecutor
और FutureTask
में देख रहा हूँ, सभी उपलब्ध java.util.concurrent
पैकेज में।
आप निष्पादकों में एक विधि को कॉल करके एक निष्पादक सेवा सेवा बनाते हैं (उदा। newSingleThreadExecutor()
)। फिर आप ExecutorService.submit(Callable c)
के साथ एक कॉल करने योग्य ऑब्जेक्ट पास कर सकते हैं।
call()
विधि ExecutorService
द्वारा प्रदान किए गए थ्रेड द्वारा चलाया जाता है, जहां लौटाई गई वस्तु कॉलिंग थ्रेड पर वापस "कूद" करती है? इस सरल उदाहरण में
देखो:
1 ExecutorService executor = Executors.newSingleThreadExecutor();
2 public static void main(String[] args) {
3 Integer i = executor.submit(new Callable<Integer>(){
4 public Integer call() throws Exception {
5 return 10;
6 }
7 }).get();
8 System.out.print("Returns: " + i + " Thread: " + Thread.currentThread.getName());
9 // prints "10 main"
10 }
कैसे है यह संभव है कि कॉल विधि है, जो एक अलग थ्रेड द्वारा चलाया जाता है, में पूर्णांक पूर्णांक वस्तु में लौट आता है (पंक्ति 3) तो यह कर सकते हैं मुख्य धागे (पंक्ति 7) में System.out
कथन द्वारा मुद्रित किया जाए?
क्या ExecutorService
से पहले अपने धागे को चलाने के लिए मुख्य थ्रेड चलाने के लिए संभव नहीं है, ताकि System.out statement
प्रिंट नल हो?
इस कोड में कुछ संकलन त्रुटियां हैं; उदाहरण के लिए, 'execor.submit' एक भविष्य देता है, एक इंटीजर नहीं, और 'currentThread' एक विधि है जिसे कॉल करने की आवश्यकता होती है। अगर कोई कामकाजी उदाहरण देखने की परवाह करता है, तो http://ideone.com/myoMB –
देखें, मैं उस कोड को हाथ से लिख रहा था। :-) मैं आपके उदाहरण पर एक नज़र डालेगा। – Rox
अरे कोई समस्या नहीं, मैं बस सहायक होने की कोशिश कर रहा था। यह एक अच्छा प्रश्न है। +1 –