Tasks Submit करना: Runnable बनाम Callable
Runnable और Callable tasks submit करें तथा Future के माध्यम से results प्राप्त करें।
Tasks Submit करना: Runnable बनाम Callable, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
Runnable बनाम Callable
ExecutorService को सबमिट किए जाने वाले कार्यों को दो कार्यात्मक इंटरफ़ेस दर्शाते हैं:
- Runnable: कोई लौटाया गया मान नहीं, जाँचे गए अपवाद घोषित नहीं कर सकता
- Callable<V>: V प्रकार का परिणाम लौटाता है, जाँचे गए अपवाद उत्पन्न कर सकता है
import java.util.concurrent.*;
// Runnable — no return value
Runnable r = () -> System.out.println("Running");
// Callable<Integer> — returns a value
Callable<Integer> c = () -> {
return 42; // or do computation
};submit(Runnable)
submit(Runnable) एक Future<?> लौटाता है। इस पर get() कॉल करने पर null लौटता है, लेकिन यह पुष्टि करता है कि कार्य पूरा हो गया है (या कार्य विफल होने पर अपवाद उत्पन्न करता है)।
ExecutorService pool = Executors.newFixedThreadPool(2);
Future<?> future = pool.submit(() ->
System.out.println("Task done on " + Thread.currentThread().getName())
);
future.get(); // waits for completion; returns null
System.out.println("Task confirmed complete");
pool.shutdown();submit(Callable<V>)
submit(Callable) एक Future<V> लौटाता है। परिणाम प्राप्त करने के लिए future.get() कॉल करें (यह पूरा होने तक अवरुद्ध रहता है)।
ExecutorService pool = Executors.newFixedThreadPool(2);
Callable<Integer> sumTask = () -> {
int sum = 0;
for (int i = 1; i <= 100; i++) sum += i;
return sum;
};
Future<Integer> future = pool.submit(sumTask);
Integer result = future.get(); // blocks until done
System.out.println("Sum 1..100 = " + result); // 5050
pool.shutdown();invokeAll के साथ कई Callable सबमिट करना
invokeAll() कई Callable का संग्रह सबमिट करता है और Futures की एक List लौटाता है—लौटने से पहले सभी पूरे हो जाते हैं:
List<Callable<String>> tasks = List.of(
() -> "Result A",
() -> "Result B",
() -> "Result C"
);
ExecutorService pool = Executors.newFixedThreadPool(3);
List<Future<String>> futures = pool.invokeAll(tasks);
for (Future<String> f : futures) {
System.out.println(f.get());
}
pool.shutdown();invokeAny: पहला सफल परिणाम
invokeAny() कई Callable का संग्रह सबमिट करता है और सफलतापूर्वक पूरा होने वाले पहले Callable का परिणाम लौटाता है तथा बाकी को रद्द कर देता है:
List<Callable<String>> candidates = List.of(
() -> { Thread.sleep(200); return "Slow"; },
() -> { Thread.sleep(50); return "Fast"; },
() -> { Thread.sleep(100); return "Medium"; }
);
ExecutorService pool = Executors.newFixedThreadPool(3);
String winner = pool.invokeAny(candidates);
System.out.println("First: " + winner); // Fast
pool.shutdown();execute() बनाम submit()
execute(Runnable) कार्य शुरू करके आगे बढ़ जाता है—कोई Future नहीं लौटाया जाता और जब तक आप बिना संभाले गए अपवादों का हैंडलर न जोड़ें, अपवाद खो जाते हैं। submit() कार्य को Future में लपेटता है और अपवादों को सुरक्षित रखता है, जिन्हें get() के माध्यम से प्राप्त किया जा सकता है।
ExecutorService pool = Executors.newFixedThreadPool(2);
// execute: exception silently lost
pool.execute(() -> { throw new RuntimeException("Oops!"); });
// submit: exception captured in Future
Future<?> f = pool.submit(() -> { throw new RuntimeException("Oops!"); });
try {
f.get();
} catch (ExecutionException e) {
System.out.println("Caught: " + e.getCause().getMessage());
}
pool.shutdown();जाँचे गए अपवादों वाला Callable
Runnable के विपरीत, Callable जाँचे गए अपवाद उत्पन्न कर सकता है—इसलिए यह I/O और डेटाबेस संचालन के लिए स्वाभाविक विकल्प है:
Callable<String> dbQuery = () -> {
// This compiles fine — checked exception is declared on Callable.call()
if (Math.random() < 0.5) throw new java.sql.SQLException("DB error");
return "row data";
};
Future<String> f = pool.submit(dbQuery);
try {
String data = f.get();
} catch (ExecutionException e) {
if (e.getCause() instanceof java.sql.SQLException) {
System.out.println("DB failed: " + e.getCause().getMessage());
}
}स्वतंत्र गणनाओं को समानांतर चलाना
स्वतंत्र गणनाओं को समानांतर चलाने के लिए कई Callable सबमिट करें:
ExecutorService pool = Executors.newFixedThreadPool(4);
Future<Long> sumFuture = pool.submit(() -> LongStream.rangeClosed(1,1_000_000).sum());
Future<Long> prodFuture = pool.submit(() -> LongStream.rangeClosed(1,20).reduce(1L, (a,b)->a*b));
long sum = sumFuture.get();
long prod = prodFuture.get();
System.out.println("Sum: " + sum + ", 20!: " + prod);
pool.shutdown();Callable परिणामों का एकत्रीकरण
कई कार्य सबमिट करें और सभी के पूरे हो जाने के बाद परिणामों को एकत्र करें:
int N = 8;
ExecutorService pool = Executors.newFixedThreadPool(N);
List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < N; i++) {
final int chunk = i;
futures.add(pool.submit(() -> chunk * chunk)); // i^2
}
int total = 0;
for (Future<Integer> f : futures) total += f.get();
System.out.println("Sum of squares: " + total);
pool.shutdown();Callable पर समय-सीमा
अनिश्चित समय तक प्रतीक्षा करने से बचने के लिए future.get(timeout, unit) में समय-सीमा दें:
Future<String> f = pool.submit(() -> {
Thread.sleep(5000); // slow task
return "done";
});
try {
String result = f.get(1, TimeUnit.SECONDS);
} catch (TimeoutException e) {
System.out.println("Task timed out");
f.cancel(true); // interrupt the task
} catch (ExecutionException e) {
System.out.println("Task failed: " + e.getCause());
}सर्वोत्तम अभ्यास
सर्वोत्तम अभ्यासों का सारांश:
execute()की जगहsubmit()का उपयोग करें—अपवाद सुरक्षित रखे जाते हैं- जब लौटाया गया मान या जाँचे गए अपवाद आवश्यक हों, तब Callable का उपयोग करें
- हमेशा
future.get()को समय-सीमा के साथ कॉल करें - बैच संसाधन के लिए invokeAll और सबसे पहले उत्तर देने वाले कार्य के लिए invokeAny का उपयोग करें
- पूल को हमेशा बंद करें
त्वरित जाँच
Runnable की तुलना में Callable का मुख्य लाभ क्या है?
पुनरावलोकन: Runnable बनाम Callable
मुख्य बातें:
- Runnable: void, कोई जाँचा गया अपवाद नहीं; submit null वाला Future<?> लौटाता है
- Callable: V लौटाता है, जाँचे गए अपवाद उत्पन्न कर सकता है; submit Future<V> लौटाता है
- invokeAll: बैच सबमिट करता है और सभी के पूरे होने की प्रतीक्षा करता है
- invokeAny: पहला सफल परिणाम लौटाता है और बाकी को रद्द करता है
- अपवादों को सुरक्षित रखने के लिए हमेशा submit() का उपयोग करें
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “Tasks Submit करना: Runnable बनाम Callable” पाठ निःशुल्क है?
हाँ—“Tasks Submit करना: Runnable बनाम Callable” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Tasks Submit करना: Runnable बनाम Callable” में मैं क्या सीखूँगा?
Runnable और Callable tasks submit करें तथा Future के माध्यम से results प्राप्त करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“Tasks Submit करना: Runnable बनाम Callable” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- ExecutorService और Thread Pool के प्रकार
- Tasks Submit करना: Runnable बनाम Callable
- Future और Error Handling
- Recurring Tasks के लिए ScheduledExecutorService