Future और Error Handling
timeouts के साथ Future.get का उपयोग करें, ExecutionException को handle करें और चल रहे tasks को cancel करें।
Future और Error Handling, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
Future क्या है?
एक Future<V> अतुल्यकालिक गणना के लंबित परिणाम को दर्शाता है। यह पूर्णता जाँचने, परिणाम की प्रतीक्षा करने और त्रुटियों को संभालने के तरीके प्रदान करता है।
import java.util.concurrent.*;
ExecutorService pool = Executors.newFixedThreadPool(2);
Future<Integer> future = pool.submit(() -> {
Thread.sleep(1000);
return 42;
});
System.out.println("Is done? " + future.isDone()); // false
Integer result = future.get(); // blocks
System.out.println("Result: " + result); // 42
pool.shutdown();समय-सीमा के साथ future.get()
अनिश्चित समय तक अटकने से बचने के लिए हमेशा समय-सीमा वाले रूप को प्राथमिकता दें:
try {
Integer result = future.get(5, TimeUnit.SECONDS);
System.out.println(result);
} catch (TimeoutException e) {
System.out.println("Timed out");
future.cancel(true); // interrupt the task
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
System.out.println("Task threw: " + e.getCause());
}ExecutionException
यदि कार्य ने कोई अपवाद उत्पन्न किया है, तो future.get() उसे ExecutionException में लपेट देता है। getCause() से मूल अपवाद निकालें:
Future<String> failing = pool.submit(() -> {
throw new IllegalArgumentException("bad input");
});
try {
failing.get();
} catch (ExecutionException e) {
Throwable cause = e.getCause();
System.out.println(cause.getClass().getSimpleName()); // IllegalArgumentException
System.out.println(cause.getMessage()); // bad input
}Future रद्द करना
cancel(mayInterruptIfRunning) कार्य को रद्द करने का प्रयास करता है। सफल होने पर true लौटाता है। यदि mayInterruptIfRunning true है, तो चल रहे थ्रेड को इंटरप्ट भेजा जाता है।
Future<String> f = pool.submit(() -> {
try {
Thread.sleep(10_000); // long task
return "done";
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return "interrupted";
}
});
boolean cancelled = f.cancel(true); // send interrupt
System.out.println("Cancelled: " + cancelled); // true
System.out.println("Is cancelled: " + f.isCancelled()); // trueisCancelled बनाम isDone
isDone() true लौटाता है यदि कार्य सामान्य रूप से पूरा हुआ, कोई अपवाद उत्पन्न हुआ या कार्य रद्द किया गया। isCancelled() केवल तभी true लौटाता है जब कार्य रद्द किया गया हो।
// After cancel:
System.out.println(f.isDone()); // true
System.out.println(f.isCancelled()); // true
// After normal completion:
Future<Integer> done = pool.submit(() -> 5);
done.get(); // wait
System.out.println(done.isDone()); // true
System.out.println(done.isCancelled()); // falseपहले उपलब्ध परिणामों के लिए CompletionService
ExecutorCompletionService एक पूल को लपेटता है और अगले पूर्ण Future को प्राप्त करने के लिए take() तरीका प्रदान करता है (सबमिट किए जाने के क्रम में नहीं, बल्कि पूर्णता के क्रम में):
ExecutorCompletionService<Integer> cs =
new ExecutorCompletionService<>(pool);
for (int i = 0; i < 5; i++) {
final int delay = 5 - i; // submit fastest last
cs.submit(() -> { Thread.sleep(delay * 100); return delay; });
}
for (int i = 0; i < 5; i++) {
Future<Integer> f = cs.take(); // next completed
System.out.println(f.get());
}कई Futures को सुरक्षित रूप से संभालना
कई futures से परिणाम एकत्र करते समय, प्रत्येक future के लिए अलग-अलग पुनरावृत्ति करके अपवादों को संभालें:
List<Future<String>> futures = new ArrayList<>();
for (int i = 0; i < 5; i++) {
final int id = i;
futures.add(pool.submit(() ->
id % 2 == 0 ? "ok_" + id : (() -> { throw new RuntimeException("fail_"+id); }).get()
));
}
for (Future<String> f : futures) {
try {
System.out.println(f.get());
} catch (ExecutionException e) {
System.out.println("Error: " + e.getCause().getMessage());
}
}पूल बंद होने के बाद Future.get()
shutdown() के बाद सबमिट करने पर RejectedExecutionException उत्पन्न होता है। लेकिन shutdown() से पहले सबमिट किए गए Futures को shutdown() के बाद भी प्राप्त किया जा सकता है:
ExecutorService pool2 = Executors.newFixedThreadPool(2);
Future<Integer> f = pool2.submit(() -> 99);
pool2.shutdown(); // no new tasks
// Still valid — task was submitted before shutdown:
System.out.println(f.get()); // 99
try {
pool2.submit(() -> 0); // throws!
} catch (RejectedExecutionException e) {
System.out.println("Pool shut down");
}FutureTask: मैन्युअल Future
FutureTask<V> Runnable और Future<V> दोनों को लागू करता है—जब आपको ExecutorService के बिना Future की आवश्यकता हो, तब यह उपयोगी है:
FutureTask<String> task = new FutureTask<>(() -> "computed");
new Thread(task).start(); // run in any thread
System.out.println(task.get()); // computedFuture के साथ पुनःप्रयास पैटर्न
future.get() के चारों ओर सरल पुनःप्रयास तर्क लागू करें:
Future<String> future = pool.submit(() -> {
if (Math.random() < 0.7) throw new RuntimeException("transient error");
return "success";
});
for (int attempt = 0; attempt < 3; attempt++) {
try {
System.out.println(future.get());
break;
} catch (ExecutionException e) {
System.out.println("Attempt " + (attempt+1) + " failed");
if (attempt == 2) throw e;
future = pool.submit(() -> "retry"); // resubmit
}
}Future की सीमाएँ
java.util.concurrent.Future की कुछ सीमाएँ हैं:
- कोई कॉलबैक नहीं—get() के साथ अवरुद्ध होना आवश्यक है
- रूपांतरणों को श्रृंखलाबद्ध नहीं किया जा सकता
- कई futures को संयोजित नहीं किया जा सकता
रिएक्टिव, गैर-अवरोधक संयोजन के लिए CompletableFuture (अगले पाठ्यक्रम में) का उपयोग करें।
त्वरित जाँच
कोई कार्य अपवाद उत्पन्न करता है। जब आप future.get() कॉल करते हैं, तो कौन-सा अपवाद उत्पन्न होता है?
पुनरावलोकन: Future और त्रुटि प्रबंधन
मुख्य बातें:
- future.get() अवरुद्ध करता है; हमेशा समय-सीमा वाले रूप का उपयोग करें
- ExecutionException कार्य के अपवादों को लपेटता है; getCause() से मूल अपवाद निकालें
- cancel(true) इंटरप्ट भेजता है; स्थिति जानने के लिए isDone/isCancelled का उपयोग करें
- ExecutorCompletionService.take() Futures को पूर्णता के क्रम में प्राप्त करता है
- FutureTask Runnable और Future दोनों को लागू करता है
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “Future और Error Handling” पाठ निःशुल्क है?
हाँ—“Future और Error Handling” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Future और Error Handling” में मैं क्या सीखूँगा?
timeouts के साथ Future.get का उपयोग करें, ExecutionException को handle करें और चल रहे tasks को cancel करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“Future और Error Handling” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- ExecutorService और Thread Pool के प्रकार
- Tasks Submit करना: Runnable बनाम Callable
- Future और Error Handling
- Recurring Tasks के लिए ScheduledExecutorService