जावा में एसिंक्रोनस प्रोग्रामिंग का परिचय
आधुनिक अनुप्रयोगों में उच्च प्रदर्शन और प्रतिक्रियाशीलता की आवश्यकता होती है। जावा में एसिंक्रोनस प्रोग्रामिंग एक ऐसा दृष्टिकोण है जो लंबी अवधि के संचालन (जैसे डेटाबेस क्वेरी, API कॉल, फ़ाइल पढ़ना) को मुख्य निष्पादन थ्रेड को ब्लॉक किए बिना निष्पादित करने की अनुमति देता है। कार्य पूरा होने की प्रतीक्षा करने के बजाय, प्रोग्राम काम करना जारी रखता है, और परिणाम तैयार होने पर संसाधित किया जाता है।
इस गाइड में, हम जावा में एसिंक्रोनस प्रोग्रामिंग की बुनियादी अवधारणाओं को समझेंगे, बुनियादी उपकरणों से शुरू करके आधुनिक CompletableFuture API तक। आप सीखेंगे कि नॉन-ब्लॉकिंग कोड कैसे बनाएं, त्रुटियों को कैसे संभालें और एसिंक्रोनस कार्यों को कैसे संयोजित करें।
मुख्य अवधारणाएँ: थ्रेड्स और ExecutorService
थ्रेड्स (Threads)
जावा में कोड को एसिंक्रोनस रूप से निष्पादित करने का सबसे सरल तरीका एक नया थ्रेड बनाना है। हालांकि, मैन्युअल रूप से थ्रेड बनाना एक महंगा ऑपरेशन है, और बड़ी संख्या में कार्यों के साथ यह प्रदर्शन समस्याओं का कारण बन सकता है।
// थ्रेड बनाने का उदाहरणThread thread = new Thread(() -> { System.out.println("एसिंक्रोनस कार्य थ्रेड में निष्पादित हो रहा है: " + Thread.currentThread().getName());});thread.start();System.out.println("मुख्य थ्रेड काम करना जारी रखता है");ExecutorService — थ्रेड पूल प्रबंधन
थ्रेड्स के कुशल प्रबंधन के लिए, जावा ExecutorService प्रदान करता है। यह एक इंटरफ़ेस है जो थ्रेड पूल बनाने, उन्हें पुन: उपयोग करने और कार्य निष्पादन को नियंत्रित करने की अनुमति देता है।
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;
public class ExecutorServiceExample { public static void main(String[] args) { // 4 थ्रेड्स का पूल बनाएं ExecutorService executor = Executors.newFixedThreadPool(4); // निष्पादन के लिए कार्य सबमिट करें executor.submit(() -> { System.out.println("कार्य थ्रेड पूल में निष्पादित हो रहा है"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("कार्य पूर्ण हुआ"); }); // पूल का कार्य समाप्त करें executor.shutdown(); }}थ्रेड पूल के मुख्य प्रकार:
newFixedThreadPool(n)— थ्रेड्स की निश्चित संख्या।newCachedThreadPool()— थ्रेड्स की गतिशील संख्या।newSingleThreadExecutor()— कार्यों के अनुक्रमिक निष्पादन के लिए एक थ्रेड।newScheduledThreadPool(n)— विलंब के साथ कार्यों को शेड्यूल करने के लिए।
Future और CompletableFuture
Future इंटरफ़ेस
Future एक इंटरफ़ेस है जो एसिंक्रोनस ऑपरेशन के परिणाम का प्रतिनिधित्व करता है। यह जाँचने की अनुमति देता है कि कार्य पूरा हुआ है या नहीं, इसके पूरा होने की प्रतीक्षा करें और परिणाम प्राप्त करें।
import java.util.concurrent.*;
public class FutureExample { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> { Thread.sleep(2000); return 42; }); System.out.println("परिणाम की प्रतीक्षा..."); Integer result = future.get(); // परिणाम मिलने तक थ्रेड को ब्लॉक करता है System.out.println("परिणाम: " + result); executor.shutdown(); }}Future की कमी — get() विधि थ्रेड को ब्लॉक करती है। एसिंक्रोनस कार्यों के साथ अधिक लचीले काम के लिए CompletableFuture बनाया गया था।
CompletableFuture — एसिंक्रोनसिटी का शक्तिशाली उपकरण
CompletableFuture<