2014-08-29 9 views
5

मैं जावा में मल्टीथ्रेडिंग की अवधारणा सीख रहा था जहां मैं इस बहुत ही रोचक व्यवहार में आया था। मैं धागा बनाने के विभिन्न तरीकों से प्रयोग कर रहा था। प्रश्न के तहत अब एक है जब हम Thread का विस्तार कर रहे हैं, Runnable इंटरफेस को लागू नहीं कर रहे हैं।जावा में दिलचस्प थ्रेड व्यवहार

एक तरफ ध्यान दें पर, मुझे पता है कि यह Runnable इंटरफ़ेस को लागू करने के बजाय Thread वर्ग का विस्तार करने के लिए एकदम सही OO समझ में आता है, लेकिन इस सवाल के प्रयोजनों के लिए, मान लें कि हम Thread वर्ग बढ़ा देते हैं।

Let मेरी विस्तारित Thread वर्ग की मेरी उदाहरण हो t और मैं कोड का एक खंड पृष्ठभूमि है कि मेरी Thread वर्ग की मेरी run() विधि के भीतर लिखा है में मार डाला जाना है।

यह पूरी तरह से t.start() के साथ पृष्ठभूमि में भाग गया, लेकिन मुझे थोड़ी उत्सुकता मिली और t.run() विधि कहा जाता है। मुख्य धागे में निष्पादित कोड का टुकड़ा!

t.start() क्या करता है t.run() नहीं करता है?

+4

अपनी कक्षा अन्य वर्ग का विस्तार कर सकते हैं मेरा मानना ​​है कि आप अपने जवाब यहाँ मिल सकती है: //stackoverflow.com/questions/8579657/java-whats-the-difference-between-thread-start-and-runnable-run http://stackoverflow.com/questions/15841301/difference-between-running-and स्टार्टिंग-ए-थ्रेड –

+0

http: // stackoverflow।कॉम/ए/13134221/3436 9 42 आपको आसान - पर्याप्त भाषा में अंतर बताता है। बहुत अधिक ** t.start(); ** एक नया धागा बना रहा है/बना रहा है जबकि ** t.run(); ** इसे केवल मुख्य थ्रेड – jbutler483

उत्तर

8

कक्षा यही करता है। T.start() वास्तव में एक नया धागा शुरू करेगा और उसके बाद उस थ्रेड में रन() को कॉल करेगा। यदि आप सीधे रन() को आमंत्रित करते हैं तो आप इसे अपने वर्तमान थ्रेड में चलाते हैं।

public class Test implements Runnable() { 
    public void run() { System.out.println("test"); } 
} 

... 

public static void main(String...args) { 
    // this runs in the current thread 
    new Test().run(); 
    // this also runs in the current thread and is functionally the same as the above 
    new Thread(new Test()).run(); 
    // this starts a new thread, then calls run() on your Test instance in that new thread 
    new Thread(new Test()).start(); 
} 

यह इरादा व्यवहार है।

+0

वाह, अद्भुत स्पष्टीकरण पर कॉल करता है! आपके उत्तर के लिए धन्यवाद। :) – avismara

1

t.start() बस यह कहता है कि यह एक नया धागा शुरू करता है, जो run() कोड के भाग को निष्पादित करता है। t.run() वर्तमान कार्य थ्रेड (आपके मामले में, मुख्य धागे) से किसी ऑब्जेक्ट पर फ़ंक्शन कॉल है।

बस ध्यान रखें: केवल start() थ्रेड के फ़ंक्शन को कॉल करते समय, एक नया धागा शुरू होता है, अन्यथा, इसे इसके कार्यों को कॉल करना (start() के अलावा) किसी अन्य भिन्न ऑब्जेक्ट पर सादे फ़ंक्शन को कॉल करने जैसा ही होता है।

+0

आपके उत्तर के लिए धन्यवाद। :) – avismara

0

t.start() वास्तव में run() विधि को नए थ्रेड में निष्पादित करने के लिए मूल कॉल करता है। t.run() वर्तमान धागे में केवल run() निष्पादित करता है।

अब,

एक तरफ ध्यान दें पर, मैं वाकिफ हूँ कि यह सही OO समझ में आता है Runnable इंटरफ़ेस को लागू करने से धागा वर्ग

वास्तव में विस्तार करने के लिए, यह सही OO समझ में आता है किसी भी दृष्टिकोण का पालन करने के लिए (चलने योग्य या विस्तारित थ्रेड लागू)। ऐसा नहीं है कि ओओ भावना में बुरा है। (। जो पराक्रम वास्तव में अपने OO डिजाइन तोड़ने): http लाभ यह है कि आप को लागू करने से मिलता है Runnable कि आप

+0

एस/मुख्य धागा/वर्तमान धागा /, AFAIK। – DarkDust

+0

मैं वर्तमान संदर्भ के संबंध में बात कर रहा था। यदि आप 'थ्रेड' में सुविधाओं और कार्यक्षमताओं को जोड़ने की योजना बना रहे हैं, तो यह 'थ्रेड' वर्ग को विस्तारित करने के लिए समझ में आता है। यदि आप सिर्फ एक नया धागा बनाना चाहते हैं, तो 'रननेबल' कक्षा लागू करें। :) – avismara

+0

@ डार्कडस्ट - मैं आपको नहीं मिल रहा हूं। – TheLostMind

संबंधित मुद्दे