मैंने एक टेस्ट ऐप लिखा है जिसे कभी नहीं रोकना चाहिए। यह t.wait()
(t
Thread
ऑब्जेक्ट है) जारी करता है, लेकिन मैं कभी भी सूचित नहीं करता हूं। यह कोड क्यों समाप्त होता है? t
पर सिंक्रनाइज़ करने वाले मुख्य थ्रेड के बावजूद, स्पॉन्टेड थ्रेड चलता है, इसलिए यह इस ऑब्जेक्ट को लॉक नहीं करता है।क्या जावा प्रतीक्षा थ्रेड को स्पष्ट रूप से सूचित करता है?
public class ThreadWait {
public static void main(String sArgs[]) throws InterruptedException {
System.out.println("hello");
Thread t = new MyThread();
synchronized (t) {
t.start();
Thread.sleep(5000);
t.wait();
java.lang.System.out.println("main done");
}
}
}
class MyThread extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
java.lang.System.out.println("" + i);
try {
Thread.sleep(500);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
नतीजा यह है कि मुख्य थ्रेड 5 सेकंड इंतजार कर रहा है और इस समय के दौरान कार्यकर्ता इसके उत्पादन देता है। फिर 5 सेकंड समाप्त होने के बाद, कार्यक्रम निकलता है। t.wait()
इंतजार नहीं करता है। यदि मुख्य धागा 5 सेकंड (इस लाइन पर टिप्पणी करने) के लिए सो नहीं जाएगा, तो t.wait()
वास्तव में कार्यकर्ता समाप्त होने तक प्रतीक्षा करेगा। बेशक, join()
यहां उपयोग करने का एक तरीका है, लेकिन, अप्रत्याशित रूप से, wait()
join()
जैसा ही काम करता है। क्यूं कर?
शायद JVM देखता है के बाद से केवल एक धागा चल रहा है, वहाँ मुख्य थ्रेड सूचित करने के लिए कोई संभावना नहीं है और गतिरोध को हल करती है कि,। यदि यह सच है, तो क्या यह एक दस्तावेज सुविधा है?
Windows XP पर परीक्षण कर रहा हूँ, जावा 6.
क्या जब होता है आप केवल 1 या 2 सेकंड के लिए सोने के? तो मैं शर्त लगाता हूं कि आपके पास थ्रेड टी के लिए चलने के लिए मुख्य धागा इंतजार होगा ... – Renato