2017-05-15 12 views
9

ExecutorService निम्न विधि है:क्यों निष्पादक सेवा भविष्य भविष्य <?> सबमिट (चलने योग्य कार्य)?

Future<?> submit(Runnable task)

लेकिन चूंकि इस Future के get विधि हमेशा null वापस आ जाएगी निम्नलिखित हस्ताक्षर अधिक उपयुक्त नहीं हो सकता है?

Future<Void> submit(Runnable task)

उत्तर

1

क्योंकि ExecutorService के Future इंटरफेस के लिए नहीं एक और धागे से एक वापसी डेटा प्राप्त करने के लिए बनाई गई है बस इसे चलाते हैं। Future<Void> submit(Runnable task)new Thread(runnable).start() के समान काम करता है, null की वापसी कुछ मामलों के लिए सार्थक है।

संपादित करें: सोचें कि आपको 20 मिनट के बाद थ्रेड बंद करने की आवश्यकता है। जब आप वापसी मूल्य void करते हैं तो आप ऐसा कैसे करेंगे?

Future<Void> future = execService.submit(operation); 
execService.shutdown(); 
opResult = future.get(20, TimeUnit.MINUTES); 

इस कोड future पर कोई वापसी न होने के कारण त्रुटि देना चाहिए। लेकिन अगर यह शून्य हो जाता है तो execService नियंत्रक ऑब्जेक्ट को पता चलेगा कि shutdown हुआ है। या यदि यह 20 मिनट execService.shutdownNow() में कुछ भी वापस नहीं किया जा सकता है।

+1

में यदि ऐसा है तो 'भविष्य ', यह ठीक उसी तरह के रूप में यह अब करता है काम करेगा बदलते। – starikoff

+0

आप कॉल विधि से शून्य कैसे वापस कर सकते हैं? –

+1

'शून्य विधि() {वापसी शून्य; } ' – starikoff

1

ध्यान दें कि Runnable की run विधि void आदिम लौटाती है और Void प्रकार नहीं है। इसी कारण से, Future में Void प्रकार नहीं हो सकता है और समाधान इसे वाइल्डकार्ड बनाना था। ध्यान दें कि Future जावा 1.5 से है जबकि Runnable 1.0 से है। विरासत कोड कारणों से Future के अनुरूप वे run के रिटर्न प्रकार को नहीं बदलेंगे।

+0

'भविष्य की विधि विधि हमेशा' शून्य 'वापस आ जाएगी जो इस स्थिति में बिल्कुल पूछे जाने वाले हैं। 'भविष्य ' किसी भी ऑब्जेक्ट को वापस कर सकता है, जब वास्तव में यह 'विशेष' विधि के जावडोक में बताए गए अनुसार, इस विशेष मामले में हमेशा 'शून्य' वापस कर देगा। तो भविष्य में 'सही विकल्प होगा।अनुवांशिक, यदि 'रन'' भविष्य '' 'डबल 'वापस लौटा होगा तो' भविष्य 'के बजाय उपयुक्त होगा। – Roland

1

जेडीके 1.8 अंदर सबमिट विधि कार्यान्वयन शून्य का उपयोग किया जाता है जबकि jdk1.6 में यह ऑब्जेक्ट था। मेरी समझ यह है कि यह शून्य का उपयोग करने के लिए अधिक उपयुक्त है इसलिए यह इंटरफ़ेस का समर्थन करने के लिए नहीं है। यह

public Future<?> submit(Runnable task) { 
     if (task == null) throw new NullPointerException(); 
     RunnableFuture<Void> ftask = newTaskFor(task, null); 
     execute(ftask); 
     return ftask; 
    } 

और JDK 1,6

public Future<?> submit(Runnable task) { 
     if (task == null) throw new NullPointerException(); 
     RunnableFuture<Object> ftask = newTaskFor(task, null); 
     execute(ftask); 
     return ftask; 
    } 
+0

हां, मुझे लगता है कि वे बाद में इंटरफेस को बदलना नहीं चाहते हैं। लेकिन यह पहली जगह में जिस तरह से परिभाषित किया गया था? 'शून्य' प्रकार [जावा 1.1] के बाद उपलब्ध था (https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html)। तो मुझे लगता है कि यह सिर्फ एक गलती थी। – Roland

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