Java में पूरा भविष्य कैसे बनाये


87

जावा में पूर्ण भविष्य के निर्माण का सबसे अच्छा तरीका क्या है? मैंने अपने स्वयं के CompletedFutureनीचे लागू किया है , लेकिन कुछ इस तरह की उम्मीद कर रहा था जो पहले से मौजूद है।

public class CompletedFuture<T> implements Future<T> {
    private final T result;

    public CompletedFuture(final T result) {
        this.result = result;
    }

    @Override
    public boolean cancel(final boolean b) {
        return false;
    }

    @Override
    public boolean isCancelled() {
        return false;
    }

    @Override
    public boolean isDone() {
        return true;
    }

    @Override
    public T get() throws InterruptedException, ExecutionException {
        return this.result;
    }

    @Override
    public T get(final long l, final TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
        return get();
    }
}

1
सबसे अच्छा तरीका है कि एक न बनाएं! ;-) आपको भविष्य को लागू करने की आवश्यकता क्यों है? क्या आप मौजूदा वस्तुओं का उपयोग नहीं कर सकते हैं जो बदले में भविष्य लौटाते हैं?
18

1
मुझे संदेह है कि कोई भी मौजूद नहीं है क्योंकि मैंने कभी भी एक कारण नहीं देखा है। शायद आप समझा सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?
पीटर लॉरी

1
@PeterLawrey मुझे लगता है कि उसे कुछ API के लिए इसकी आवश्यकता है जो कि कुछ कारणों से वायदा के साथ काम करना चाहता है, हालांकि यह वास्तव में केवल इसके मूल्यों की आवश्यकता है। या फिर उसे मज़ाक करने की ज़रूरत है। कम से कम यही एकमात्र कारण है जिसकी मैं कल्पना कर सकता हूं।
क्यूबिक

9
इकाई परीक्षण इसे चाहने का एक अच्छा कारण होगा - परीक्षण मूल्यों के साथ भविष्य की वापसी करने वाली एक नकली सेवा।
लुई वासरमैन

3
@Cubic। कैसे के बारे में अगर आपके पास एक विधि है जो एक कॉल करने योग्य <T> को स्वीकार करती है और जो उपलब्ध संसाधनों या अन्य कारकों जैसे कि विकल्प पहले से ही प्रदान किए गए विकल्पों पर अतुल्यकालिक रूप से काम चला सकते हैं या नहीं कर सकते हैं? कल्पना कीजिए कि यदि Executor.execute (Runnable) ने Callable <T> को पैरामीटर के रूप में लिया और इसे निष्पादन थ्रेड में चलाने का निर्णय लिया, तो क्या कार्यान्वयन को अपना Future <T> बनाने की आवश्यकता नहीं होगी?
मार्टिन एंडर्सन

जवाबों:


66

अपाचे कॉमन्स लैंग उसी तरह के कार्यान्वयन को परिभाषित करता है जिसे कॉन्स्टेंटफ्यूवन कहा जाता है, आप इसे कॉल करके प्राप्त कर सकते हैं:

Future<T> future = ConcurrentUtils.constantFuture(T myValue);

नीचे दिए गए
विवरणों को

201

जावा 8 में आप बिल्ट-इन कंप्लीटटेबल सिवनी का उपयोग कर सकते हैं:

 Future future = CompletableFuture.completedFuture(value);

यह आपको एक पूर्ण भविष्य प्रदान करेगा। इसके बजाय नए कंपेटिबलफ्यूचर () का उपयोग करें।
zafar142003

8
@ zafar142003 ओपी ने पूरा भविष्य पूछा, नहीं?
Andrejs

प्रश्न विवरण (2012 में) में कक्षा को देखते हुए, मुझे लगता है कि ओपी एक 'कम्प्लीटटेबल सिवनी' को लागू करना चाहता था। लेकिन मुझे लगता है, यह अब एक मूक बिंदु है।
zafar142003

प्रश्न विवरण में कक्षा को देखते हुए, ऐसा लगता है कि ओपी तत्काल मूल्य के साथ एक भविष्य चाहता था। देखें कि isDoneहमेशा सच होता है। इसलिए, यह एक उत्कृष्ट उत्तर है।
नथनाफ्रैंक


2
FutureTask<String> ft = new FutureTask<>(() -> "foo");
ft.run();

System.out.println(ft.get());

"फू" प्रिंट करेगा;

आपके पास एक भविष्य भी हो सकता है जो एक अपवाद को फेंक देता है जब मिलता है () कहा जाता है:

FutureTask<String> ft = new FutureTask<>(() -> {throw new RuntimeException("exception!");});
ft.run();

-3

मुझे जावा rt.jar में आपका एक समान वर्ग मिला

com.sun.xml.internal.ws.util.CompletedFuture

यह आपको एक अपवाद निर्दिष्ट करने की अनुमति देता है जिसे प्राप्त होने पर फेंक दिया जा सकता है ()। यदि आप एक अपवाद नहीं फेंकना चाहते हैं, तो बस इसे शून्य करने के लिए सेट करें।


2
आम तौर पर, com.sun.*पैकेज में किसी भी चीज का उपयोग करना एक महान विचार नहीं है। उन वर्गों को आम तौर पर एक आंतरिक कार्यान्वयन विवरण माना जाता है, और जावा के संस्करणों में परिवर्तन के लिए उत्तरदायी हैं।
जेम्स किंग्सबेरी

-6

जावा 6 में आप निम्नलिखित का उपयोग कर सकते हैं:

Promise<T> p = new Promise<T>();
p.resolve(value);
return p.getFuture();

3
मुझे नहीं लगता कि जावा कोर लाइब्रेरी में ऐसा है। यह किस बाहरी निर्भरता का उपयोग करता है?
Jorn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.