implements Runnable बनाम extends Thread: Java इंटरव्यू में न करें ये गलतियाँ

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

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

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

implements Runnable vs extends Thread: क्यों 90% Java डेवलपर्स गलती करते हैं?

\n\n

कल्पना कीजिए: आप एक बड़ी IT कंपनी में इंटरव्यू दे रहे हैं। HR मुस्कुराते हुए एक "आसान" सवाल पूछता है: "Java में implements Runnable और extends Thread में क्या अंतर है?"। लगता है इसमें इतना मुश्किल क्या है? लेकिन Stack Overflow के आंकड़ों के अनुसार, यहीं पर अनुभवी डेवलपर्स भी फंस जाते हैं। हज़ारों व्यूज़, सैकड़ों कमेंट्स — "Java Runnable vs Thread" का टॉपिक आज भी सबसे गर्मागर्म बना हुआ है।

\n\n

इस लेख में हम सिर्फ अंतर नहीं बताएंगे। हम टॉप-5 रियल गलतियों को डिटेल में समझाएंगे जो प्रोग्रामर्स करते हैं, और दिखाएंगे कि कैसे क्लीन, स्केलेबल मल्टीथ्रेडेड कोड लिखें। अगर आप Java में लिखते हैं और सीधे Thread का उपयोग करते हैं — तो ध्यान से पढ़ें। हो सकता है आप खुद अनजाने में अपनी मुश्किलें बढ़ा रहे हों।

\n\n

त्वरित जानकारी: Thread और Runnable क्या हैं?

\n\n

गहराई में जाने से पहले, बेसिक्स को ताज़ा कर लेते हैं। Java Thread एक क्लास है जो एक execution thread को रिप्रेजेंट करता है। यह कोड को parallel mode में चला सकता है। Runnable एक फंक्शनल इंटरफ़ेस है जिसमें सिर्फ एक मेथड run() होता है। यह एक टास्क को डिफाइन करता है जिसे execute करना है, लेकिन यह नहीं जानता कि इसे कैसे शुरू करना है।

\n\n

यह रहा extends Thread का क्लासिक उदाहरण:

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

और यही कार्यक्षमता implements Runnable के साथ:

\n\n
public class MyTask implements Runnable {\n    @Override\n    public void run() {\n        System.out.println("टास्क execute हो रहा है: " + Thread.currentThread().getName());\n    }\n\n    public static void main(String[] args) {\n        Thread t = new Thread(new MyTask());\n        t.start();\n    }\n}
\n\n

पहली नज़र में अंतर बहुत छोटा लगता है। लेकिन शैतान, हमेशा की तरह, डिटेल में छिपा है।

\n\n

Thread और Runnable के साथ टॉप-5 गलतियाँ

\n\n

गलती #1: जहाँ Runnable चाहिए, वहाँ Thread को extend करना

\n\n

सबसे आम समस्या है Thread क्लास के साथ टाइट कपलिंग। जब आप extends Thread लिखते हैं, तो आपकी क्लास खुद एक थ्रेड बन जाती है। आप किसी दूसरी क्लास को extend करने की क्षमता खो देते हैं। Java में सिंगल इनहेरिटेंस है, और यह एक गंभीर सीमा है।

\n\n

खराब कोड का उदाहरण:

\n\n
public class DataProcessor extends Thread {\n    // अब JFrame, ArrayList या कोई और उपयोगी क्लास को extend नहीं कर सकते\n    @Override\n    public void run() {\n        // डेटा प्रोसेसिंग\n    }\n}
\n\n

सही तरीका: implements Runnable का उपयोग करें। यह एक इंटरफ़ेस है — आप इसे किसी भी क्लास में implement कर सकते हैं जो पहले से कुछ और extend कर रही है।

\n\n
public class DataProcessor extends BaseService implements Runnable {\n    @Override\n    public void run() {\n        // डेटा प्रोसेसिंग\n    }\n}
\n\n

गलती #2: run() और start() में कन्फ्यूज़न

\n\n

यह एक क्लासिक गलती है। नौसिखिए (और कभी-कभी अनुभवी भी) अक्सर start() की जगह run() को कॉल करते हैं। अंतर बहुत महत्वपूर्ण है: start() एक नया थ्रेड बनाता है और उसके अंदर run() को कॉल करता है। run() सीधे current thread में execute होता है, एक सामान्य मेथड की तरह।

\n\n

गलती का उदाहरण:

\n\n
Thread t = new Thread(new MyTask());\nt.run(); // सब कुछ चलता है, लेकिन उसी थ्रेड में! मल्टीथ्रेडिंग नहीं हो रही।
\n\n

कंसोल आउटपुट मुख्य थ्रेड main में होगा, न कि नए थ्रेड में। यह गलती पकड़ना मुश्किल है, क्योंकि कोड क्रैश नहीं होता — बस वह नहीं करता जो आप उम्मीद करते हैं।

\n\n

कैसे बचें: नया थ्रेड शुरू करने के लिए हमेशा start() का उपयोग करें। अगर संदेह हो, तो

ब्लॉग

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