जावा धागे
जावा धागे
थ्रेड्स एक प्रोग्राम को एक ही समय में कई चीजें करके अधिक कुशलता से संचालित करने की अनुमति देता है।
मुख्य कार्यक्रम को बाधित किए बिना पृष्ठभूमि में जटिल कार्यों को करने के लिए थ्रेड्स का उपयोग किया जा सकता है।
एक धागा बनाना
एक धागा बनाने के दो तरीके हैं।
इसे कक्षा का विस्तार करके और इसकी
विधि Thread
को ओवरराइड करके बनाया जा सकता है:run()
सिंटैक्स बढ़ाएँ
public class Main extends Thread { public void run() { System.out.println("This code is running in a thread");
}}
थ्रेड बनाने का दूसरा तरीका Runnable
इंटरफ़ेस को लागू करना है:
सिंटैक्स लागू करें
public class Main implements Runnable {
public void run() {
System.out.println("This code is running in a thread");
}
}
चल रहे धागे
यदि वर्ग वर्ग का विस्तार करता है Thread
, तो कक्षा का एक उदाहरण बनाकर और इसकी start()
विधि को कॉल करके धागा चलाया जा सकता है:
उदाहरण बढ़ाएँ
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
यदि वर्ग Runnable
इंटरफ़ेस को लागू करता है, तो थ्रेड को ऑब्जेक्ट के कंस्ट्रक्टर को क्लास का एक उदाहरण पास करके Thread
और फिर थ्रेड की
start()
विधि को कॉल करके चलाया जा सकता है:
उदाहरण लागू करें
public class Main implements Runnable {
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
"विस्तार" और "कार्यान्वयन" थ्रेड्स के बीच अंतर
मुख्य अंतर यह है कि जब कोई वर्ग थ्रेड वर्ग का विस्तार करता है, तो आप किसी अन्य वर्ग का विस्तार नहीं कर सकते हैं, लेकिन रननेबल इंटरफ़ेस को लागू करके, इसे किसी अन्य वर्ग से भी विस्तारित किया जा सकता है, जैसे: वर्ग MyClass extends OtherClass implements Runnable
।
समवर्ती समस्याएं
चूंकि थ्रेड प्रोग्राम के अन्य भागों की तरह ही चलते हैं, इसलिए यह जानने का कोई तरीका नहीं है कि कोड किस क्रम में चलेगा। जब धागे और मुख्य कार्यक्रम समान चर पढ़ और लिख रहे हैं, तो मान अप्रत्याशित हैं। इससे उत्पन्न होने वाली समस्याओं को समवर्ती समस्याएँ कहते हैं।
उदाहरण
एक कोड उदाहरण जहां परिवर्तनीय राशि का मान अप्रत्याशित है:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); System.out.println(amount); amount++; System.out.println(amount);
}public void run() { amount++;
}}
समवर्ती समस्याओं से बचने के लिए, थ्रेड्स के बीच यथासंभव कुछ विशेषताओं को साझा करना सबसे अच्छा है। यदि विशेषताओं को साझा करने की आवश्यकता है, तो एक संभावित समाधान यह isAlive()
जांचने के लिए थ्रेड की विधि का उपयोग करना है कि क्या थ्रेड बदल सकता है किसी भी विशेषता का उपयोग करने से पहले थ्रेड चलना समाप्त हो गया है।
उदाहरण
isAlive()
समवर्ती समस्याओं को रोकने के लिए उपयोग करें :
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); // Wait for the thread to finish while(thread.isAlive()) { System.out.println("Waiting...");
}// Update amount and print its value System.out.println("Main: " + amount); amount++; System.out.println("Main: " + amount);
}public void run() { amount++;
}}