जावा में समवर्तीता और मल्टीथ्रेडिंग: A से Z तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जावा में समवर्तीता और मल्टीथ्रेडिंग का परिचय

\n\n

आधुनिक एप्लिकेशनों को अक्सर एक साथ कई कार्यों को निष्पादित करने की आवश्यकता होती है। चाहे वह सर्वर पर अनुरोधों को संसाधित करना हो, फ़ाइलें डाउनलोड करना हो, या जटिल गणनाएँ हों — समवर्तीता और मल्टीथ्रेडिंग के तंत्र के बिना काम नहीं चल सकता। Java में, ये अवधारणाएँ भाषा और मानक लाइब्रेरी के स्तर पर अंतर्निहित हैं, जो इसे उच्च-प्रदर्शन वाले एप्लिकेशन बनाने के लिए सर्वोत्तम टूल में से एक बनाती हैं।

\n\n

इस लेख में, हम मूल बातों से लेकर उन्नत टूल तक सब कुछ समझेंगे: थ्रेड कैसे बनाएँ, डेटा तक पहुँच को सिंक्रोनाइज़ कैसे करें, और पैकेज java.util.concurrent से आधुनिक उपयोगिताओं का उपयोग कैसे करें। यह सामग्री शुरुआती और उन डेवलपर्स दोनों के लिए उपयोगी होगी जो अपने ज्ञान को व्यवस्थित करना चाहते हैं।

\n\n

थ्रेड क्या है और इसकी आवश्यकता क्यों है?

\n\n

थ्रेड एक हल्की प्रक्रिया है जो एप्लिकेशन के अंदर चलती है। प्रत्येक Java प्रोग्राम में कम से कम एक थ्रेड (main) होता है। मल्टीथ्रेडिंग कई थ्रेड्स को एक साथ चलाने की अनुमति देती है, जो विशेष रूप से मल्टी-कोर प्रोसेसर पर महत्वपूर्ण है।

\n\n

मल्टीथ्रेडिंग के मुख्य लाभ:

\n
    \n
  • कार्यों के समानांतर निष्पादन के माध्यम से प्रदर्शन में वृद्धि।
  • \n
  • उपयोगकर्ता इंटरफ़ेस की प्रतिक्रियाशीलता में सुधार।
  • \n
  • सिस्टम संसाधनों का कुशल उपयोग।
  • \n
\n\n

1. Java में थ्रेड बनाना: क्लासिकल दृष्टिकोण

\n\n

Java में थ्रेड बनाने के दो बुनियादी तरीके हैं: Thread क्लास से इनहेरिट करना और Runnable इंटरफ़ेस को लागू करना। आइए दोनों पर विचार करें।

\n\n

Thread क्लास से इनहेरिट करना

\n\n

सबसे सरल तरीका Thread का सबक्लास बनाना और run() मेथड को ओवरराइड करना है।

\n\n
public class MyThread extends Thread {\n    @Override\n    public void run() {\n        System.out.println("थ्रेड " + getName() + " शुरू हो गया है।");\n    }\n\n    public static void main(String[] args) {\n        MyThread thread = new MyThread();\n        thread.start(); // थ्रेड शुरू करें\n    }\n}
\n\n

महत्वपूर्ण: run() के बजाय start() को कॉल करें। run() वर्तमान थ्रेड में कोड निष्पादित करेगा, जबकि start() एक नया थ्रेड बनाता है।

\n\n

Runnable इंटरफ़ेस को लागू करना

\n\n

अधिक लचीला दृष्टिकोण Runnable को लागू करना और इसे Thread कंस्ट्रक्टर में पास करना है।

\n\n
public class Task implements Runnable {\n    @Override\n    public void run() {\n        System.out.println("कार्य थ्रेड में निष्पादित हो रहा है: " + Thread.currentThread().getName());\n    }\n\n    public static void main(String[] args) {\n        Task task = new Task();\n        Thread thread = new Thread(task);\n        thread.start();\n    }\n}
\n\n

यह तरीका बेहतर है क्योंकि इसमें इनहेरिटेंस की आवश्यकता नहीं है और क्लास को अन्य क्लासेस का विस्तार करने की अनुमति मिलती है।

\n\n

2. सिंक्रोनाइज़ेशन और एटॉमिसिटी: डेटा रेस से कैसे बचें

\n\n

जब कई थ्रेड एक साथ साझा डेटा तक पहुँचते हैं, तो रेस कंडीशन उत्पन्न होती है। इससे बचने के लिए, Java सिंक्रोनाइज़ेशन तंत्र प्रदान करता है।

\n\n

synchronized कीवर्ड

\n\n

synchronized की मदद से किसी मेथड या कोड ब्लॉक को एक थ्रेड के लिए लॉक किया जा सकता है।

\n\n
public class Counter {\n    private int count = 0;\n\n    public synchronized void increment() {\n        count++;\n    }\n\n    public int getCount() {\n        return count;\n    }\n}
\n\n

इस उदाहरण में, एक समय में केवल एक थ्रेड increment() को निष्पादित कर सकता है। हालाँकि, इंक्रीमेंट जैसी सरल क्रियाओं के लिए, एटॉमिक क्लासेस का उपयोग करना बेहतर है।

\n\n

एटॉमिक क्लासेस (Atomic)

\n\n

पैकेज java.util.concurrent.atomic में ऐसी क्लासेस हैं जो बिना लॉक के एटॉमिक ऑपरेशन प्रदान करती हैं।

\n\n
import java.util.concurrent.atomic.AtomicInteger;\n\npublic class AtomicCounter {\n    private A                

ब्लॉग

पुस्तक अनुशंसाएँ