2011-06-14 6 views
9

मैं निष्पादक सेवाओं के लिए काफी नया हूं। खुद सबकुछ करना पसंद आया, लेकिन मुझे लगता है कि इन सेवाओं पर भरोसा करने का समय है।जावा कॉलबल फ्यूचरटास्क एक्ससेक्यूटर: समाप्त कार्य को कैसे सुनें

मैं ExecuterRunnable से हाथ देना चाहता हूं। निष्पादक एक FutureTask में लपेटता है और इसे वापस मेरे हाथों में रखता है। अब मैं done() विधि मतदान करता हूं। लेकिन जब done() विधि सही हो जाएगी तो मैं अधिसूचित होना चाहूंगा।

get() विधि है जो Runnable समाप्त होने तक ब्लॉक करती है, लेकिन फिर मुझे पूरा होने पर यह देखने के लिए कि प्रत्येक नौकरी के लिए अतिरिक्त थ्रेड की आवश्यकता होगी।

क्या मैं कार्य निष्पादन के बारे में अधिसूचित होने के लिए अपने निष्पादक को कुछ अतिरिक्त Callable सौंप सकता हूं?

यहां जाने का तरीका क्या है? मैं run विधि के अंत में कुछ कोड जोड़ सकता हूं, लेकिन फिर done() अभी भी झूठा हो सकता है ...

उत्तर

1

आप एक java.util.concurrent.ThreadPoolExecutor का उपयोग कर, तो आप अपने हुक तरीकों का उपयोग कर सकते हैं की एक विशिष्ट धारणा कर सकते हैं; बाद में() और पहले निष्पादन()।

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

वे ListenableFuture के रूप में के रूप में सुंदर नहीं हैं, लेकिन यह प्रदान की आप किसी दिए गए निष्पादक उदाहरण के लिए एक "श्रोता" का केवल एक प्रकार की जरूरत है एक पर्याप्त समाधान हो सकता है।

3

यदि आप एक ही काम करना चाहते हैं तो इसे एक ही थ्रेड में करने के लिए बेहतर है।

Executor executor = 
final Runnable runnable = 
executor.execute(new Runnable() { 
    public void run() { 
     runnable.run(); 
     // do something after the run() has finished. 
    } 
}); 

इस तरह यह क्या करेंगे जो कुछ भी आप एक ही धागे में runnable के बाद किया चाहते हैं और आप सर्वेक्षण या किसी अन्य धागे का उपयोग करने की जरूरत नहीं है।

+0

मेरे पास मल्टीथ्रेडिंग प्रश्न भी है [यहां] (http://stackoverflow.com/questions/29130563/how-can-i-terminate-tasks-that-have-timed-out-in-multithreading/)। मुझे यकीन नहीं है कि मैं अपने भविष्य के कार्य पर रद्द करने का उपयोग कैसे करूँगा, इसलिए उस पर आपसे जांच करना चाहता था। यदि संभव हो, तो क्या आप वहां पर मेरी मदद कर सकते हैं। – john

3

मैं Guava में com.google.common.util.concurrent पैकेज पर एक नज़र, विशेष रूप से ListenableFuture प्रकार और इसे से संबंधित कोड लेने की सलाह देंगे।

एक बार अगली रिलीज (आर 10) बाहर हो जाने के बाद, ExecutorService बनाना आसान होगा जो एस MoreExecutors.listeningDecorator(ExecutorService) का उपयोग कर देता है। आप वर्तमान में ListenableFutureTask में अपने Runnable s/Callable s को भी लपेट सकते हैं।

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null); 
executor.submit(task); 
task.addListener(new Runnable() { 
    public void run() { 
    // do whatever 
    } 
}, listenerExecutor); 
+0

क्या पीटर लॉरी के दृष्टिकोण का यह एक जटिल तरीका नहीं है। – irreputable

+0

शायद उस सजावट के साथ यह साफ कोड हो सकता है। वी.10 कब आ रहा है? क्या डाउनलोड करने के लिए कुछ बीटा है? –

+0

@irreputable: पीटर के दृष्टिकोण में, कार्य पूरा होने के बाद क्या करना है, इसे संभालने के कार्यकर्ता को प्रस्तुत किए गए कार्य के हिस्से के रूप में लम्बा हुआ है। यदि कार्य रद्द कर दिया गया था, उदाहरण के लिए, आपको पता नहीं चलेगा। जैसा लिखा है, प्रतिनिधि के 'रन()' में एक अपवाद भी भागने के बाद भाग का कारण बनता है। इसके अलावा आप उस सामान को बांध रहे हैं जो कार्य के समान ही धागे के बाद होता है, जिसे आप नहीं चाहते हैं। – ColinD

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