2009-05-19 35 views
7

को पूरा करने के लिए थ्रेड की प्रतीक्षा न करें मुझे स्थिर कॉल से थ्रेड को स्पिन करने का तरीका ढूंढने की आवश्यकता है और थ्रेड को पूरा करने की प्रतीक्षा न करें। असल में, एक "आग और भूल" दृष्टिकोण। क्या कोई मुझे एक सरल उदाहरण के साथ आपूर्ति कर सकता है कि यह कैसे पूरा किया जा सकता है?जावा,

+3

यह मूल रूप से धागे का डिफ़ॉल्ट व्यवहार है - क्या इस धागे को किसी बिंदु पर प्रेषण धागे को सिग्नल करने या साझा चर की स्थिति बदलने की आवश्यकता होगी? अधिक जानकारी अच्छा होगा। – Gandalf

उत्तर

26
Thread t = new Thread(new YourClassThatImplementsRunnable()); 
t.start(); 

// JDK 8 
new Thread(() -> methodYouWantToRun()).start(); 
7
public static void foo() { 
    new Thread() { 
     public void run() { 
        //do something here.... 
     } 
    }.start(); 
} 
+2

लेकिन यदि कार्य अपेक्षाकृत सरल है, तो थ्रेड के लिए रननेबल कन्स्ट्रक्टर का उपयोग करें (यानी, नया थ्रेड (नया रननेबल() {सार्वजनिक शून्य रन() {...}})), इस तरह से आप एक विस्तार नहीं कर रहे हैं जटिल वर्ग, लेकिन एक इंटरफ़ेस को कार्यान्वित करना, जो बाइटकोड में सरल होना चाहिए और आपके पास थ्रेड में विधियों के साथ कोई नाम नहीं होगा। – Gracenotes

2

मूल रूप से धागा शुरू करने और प्रदर्शन में शामिल होने नहीं है। तो आप धागे को खत्म करने की प्रतीक्षा नहीं करेंगे।

8

यदि यह एक लंबे समय तक रहा धागा अपने स्वयं ऐप से एक समान जीवन चक्र है कि है, और अन्य थ्रेड पर इंतजार कर अपने समय का एक बहुत खर्च किया जा रहा है: यदि यह एक अल्पकालिक है

new Thread(new yourLongRunningProcessThatImplementsRunnable()).start(); 

, सीपीयू बाध्य कार्य:

ExecutorService es = Executors.newFixedThreadPool(Runtime.availableProcessors()); 
es.submit(new yourTaskThatImplementsRunnable()); 

हालांकि, इस तरह ज्यादातर मामलों में, आपको लगता है कि एक ही ExecutorService के कार्यों की एक संख्या प्रस्तुत करने दिया जाएगा।

देखें:

5

अपने कार्य की प्रकृति पर निर्भर करता है, अलग अलग तरीकों से approrpiate हो सकता है:

(1) के रूप में कई उल्लेख किया है, एक सामयिक कार्य के लिए एक आम तरीका बस) एक धागे का निर्माण और अपनी शुरुआत फोन ( है तरीका।

(2) याद रखें कि यदि आपका पृष्ठभूमि धागा रुकता नहीं है, तो डिफ़ॉल्ट रूप से यह आपके थ्रेड समाप्त होने पर आपके प्रोग्राम को बंद होने से रोक देगा। आप इसलिए पर सेटडैमन (सत्य) को कॉल करना चाहते हैं ताकि इसमें यह व्यवहार न हो। (दूसरी तरफ, जीयूआई-आधारित अनुप्रयोगों में, आप आमतौर पर System.exit() को कॉल करना समाप्त कर देते हैं, और आदर्श रूप से आप अपने लंबे समय तक चलने वाले कार्य में साफ़ बंद करने का तरीका चाहते हैं।)

(3) यदि आप में अक्सर "आग और भूलने" के लिए अल्पकालिक कार्य हैं, तो जावा 5 से उपलब्ध Executors framework का उपयोग करने पर विचार करें।

+0

यह बहुत अच्छा है, धन्यवाद। – eric2323223