स्पष्टीकरण को समझने के लिए एक सरल, जावा में रननेबल क्या है? [बन्द है]


92

आम आदमी की शर्तों में जावा में "रननीय" क्या है? मैं हाई स्कूल में एक एपी प्रोग्रामिंग छात्र हूं, जिसका काम अनुसंधान करना है, या दूसरों से यह जानना है कि "रननेबल" क्या है (हम अभी ओओपी में हो रहे हैं, और अभी तक थ्रेड्स को नहीं छुआ है)।


एपीआई डॉक्स में केवल एक उपयोगी पंक्ति है: "विधि चलाने का सामान्य अनुबंध यह है कि इसमें कोई भी कार्रवाई हो सकती है।"
टॉम हॉल्टिन -

एक और अधिक दिलचस्प शोध कार्य होगा: आम आदमी की शर्तों में, जावा में "स्टॉपेबल" क्या है। प्रशिक्षक प्रशिक्षक हैं ...
उडो क्लीमाशेवस्की

9
@UdoKlimaschewski - लड़का एक हाई स्कूल का छात्र है, न कि एक स्नातक या स्नातकोत्तर छात्र। इस प्रशिक्षक की अपेक्षाएं छात्र के स्तर के अनुरूप हैं ... आईएमओ। हालांकि, मैं मानता हूं कि "पहले एसओ पर पूछें" ओपी के स्तर पर किसी के लिए उचित अनुसंधान तकनीक नहीं है।
स्टीफन सी

जवाबों:


189

एक रननेबल मूल रूप से एक प्रकार का वर्ग है (रननेबल एक इंटरफ़ेस है) जिसे धागे में रखा जा सकता है, यह वर्णन करते हुए कि धागा क्या करना है।

Runnable इंटरफ़ेस विधि लागू करने के लिए वर्ग की आवश्यकता है run()ताकि तरह:

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}

और फिर इसे इस तरह उपयोग करें:

Thread t = new Thread(new MyRunnableTask());
t.start();

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

उन्नत: अनाम प्रकार

ध्यान दें कि आपको हमेशा की तरह एक वर्ग को परिभाषित करने की आवश्यकता नहीं है, आप वह सभी इनलाइन कर सकते हैं:

Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

यह ऊपर के समान है, केवल आप एक और नामित वर्ग नहीं बनाते हैं।


68
यह एक बेहतरीन जवाब है जो इस दावे को पूरी तरह से खारिज कर देता है कि "इस सवाल का यथोचित रूप में जवाब नहीं दिया जा सकता है"।
रसेल सिल्वा

1
मुझे पता है कि यह एक लंबा समय था, लेकिन मेरे पास एक सवाल है। जब मैं थ्रेड शुरू करता हूं तो थ्रेड केवल एक बार चलाया जाता है या केवल प्रोग्राम के अंदर और ऊपर रन करता रहता है?
गामो

5
थ्रेड को तब तक चलाया जाता है जब तक कि runविधि समाप्त नहीं हो जाती है, तब थ्रेड बंद हो जाता है। यदि आप चाहते हैं कि एक धागा बार-बार चले, तो runविधि के अंदर एक लूप रखें ।
opatut

2
या केवल जावा 8 लैम्डा फ़ंक्शन का उपयोग कर:new Thread(() -> System.out.println("hello from other thread")).start();
गेब

9

Runnable एक इंटरफ़ेस के रूप में परिभाषित किया गया है:

interface Runnable {
    public void run();
}

एक वर्ग बनाने के लिए जो इसका उपयोग करता है, बस कक्षा को इस प्रकार परिभाषित करें (public) class MyRunnable implements Runnable {

यह एक नया थ्रेड बनाने के बिना भी इस्तेमाल किया जा सकता है। यह मूल रूप से एक एकल विधि, रन के साथ आपका मूल इंटरफ़ेस है, जिसे कहा जा सकता है।

यदि आप रनवेबल के साथ एक नया थ्रेड बनाते हैं जैसा कि यह पैरामीटर है, तो यह रन थ्रेड को नए थ्रेड में कॉल करेगा।

यह भी ध्यान दिया जाना चाहिए कि थ्रेड्स लागू होते हैं Runnable, और इसे तब कहा जाता है जब नया थ्रेड बनाया जाता है (नए थ्रेड में)। डिफॉल्ट इम्प्लीमेंटेशन आपको कंस्ट्रक्टर में जो भी रननेबल सौंपा गया है, उसे कॉल करता है, यही कारण है कि आप new Thread(someRunnable)थ्रेड के runतरीके को ओवरराइड किए बिना कर सकते हैं ।


क्या आप कह रहे हैं कि मूल रूप से थ्रेड को विरासत में लाने या रननेबल को लागू करने में कोई अंतर नहीं है? क्या रनरबल का उपयोग करते समय थ्रेड एक आवरण के रूप में, साथ ही निष्पादक का उपयोग करता है?
opatut

मैं कह रहा हूँ कि [थ्रेड और ओवरराइडिंग रन] का कोई अंतर नहीं है और [एक रनवे के साथ थ्रेड का एक नया उदाहरण बनाना] जो एक ही रन विधि हो]
एलेक्स कोलमैन

हाँ मिल गया। लेकिन क्या वास्तव में कोई अंतर नहीं है, न ही प्रदर्शन- और न ही अन्यथा?
1

3
@AlexColeman - एक बड़ा अंतर है। यदि आप Threadथ्रेड पूलिंग को बढ़ाते हैं तो मुश्किल है और यदि आप थ्रेड पूलिंग को लागू नहीं करते हैं तो आप हर समय नए धागे बनाने की महत्वपूर्ण लागत पहनते हैं । इसके विपरीत, बस लागू करने का Runnableमतलब है कि आप आसानी से ThreadPoolExecutorServiceया 3-पार्टी थ्रेड पूल जैसी चीजों का उपयोग कर सकते हैं ।
स्टीफन सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.