2012-12-17 19 views
6
Thread t = new Thread(new Runnable() { public void run() {} }); 

पर पैरामीटर पास करना मैं इस तरह से एक धागा बनाना चाहता हूं। यदि संभव हो तो run विधि में पैरामीटर कैसे पास कर सकते हैं?जावा थ्रेड

संपादित:

for (int i=0; i< threads.length; i++) { 
    threads[i] = new Thread(new Runnable() {public void run() {//Can I use the value of i in the method?}}); 
} 

जॉन की जवाब पर यह काम नहीं करेगा आधार पर, i के बाद से final के रूप में घोषित नहीं किया गया है: मेरी समस्या विशिष्ट बनाने के लिए, निम्न कोड खंड पर विचार करें।

+2

अगर यह संभव है यह आसान हो सकता है अगर आप एक नया वर्ग लिखते हैं कि प्रत्यारोपण में लागू होने वाले सभी पैरामीटर को चलाने योग्य और इसे पास करने के लिए। – giocarmine

+0

इंटेलिजे में इसके लिए एक ऑटो-सही है। यह अनाम कक्षाओं में आपके लिए अंतिम चर के लिए उपयोग किए जाने वाले चर निर्दिष्ट करता है। –

+0

मैं आपको थ्रेडडॉकल का उपयोग करने का सुझाव दूंगा, यह धागे को चर रखने और पास करने का एक बेहतर तरीका है, इसे आज़माएं, बेहतर –

उत्तर

10

नहीं, run विधि में कभी भी कोई पैरामीटर नहीं है। आपको प्रारंभिक स्थिति को Runnable में रखना होगा। आप एक गुमनाम आंतरिक वर्ग का उपयोग कर रहे हैं, तो आप ऐसा कर सकते हैं एक अंतिम स्थानीय चर के माध्यम से:

final int foo = 10; // Or whatever 

Thread t = new Thread(new Runnable() { 
    public void run() { 
     System.out.println(foo); // Prints 10 
    } 
}); 

आप एक नामित वर्ग लिख रहे हैं, वर्ग के लिए एक क्षेत्र को जोड़ने और निर्माता में पॉप्युलेट करें।

वैकल्पिक रूप से, आप java.util.concurrent में कक्षाएं और अधिक मदद कर सकते हैं (ExecutorService आदि) - यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

संपादित करें: अपने संदर्भ में ऊपर रखने के लिए, तुम सिर्फ पाश के भीतर एक अंतिम चर की जरूरत है:

for (int i=0; i< threads.length; i++) { 
    final int foo = i; 
    threads[i] = new Thread(new Runnable() { 
     public void run() { 
      // Use foo here 
     } 
    }); 
} 
+0

मैंने अभी कुछ संदर्भ दिया है जो मैं करने की कोशिश कर रहा हूं। –

+0

@TerryLi: लूप के भीतर अपने पहले दृष्टिकोण का उपयोग करने के तरीके के बारे में मेरा संपादन देखें। या सिर्फ एक नामित वर्ग का उपयोग करें ... –

5

आप एक कस्टम धागा उद्देश्य यह है कि आपके पैरामीटर स्वीकार करता है बना सकते हैं, उदाहरण के लिए:

public class IndexedThread implements Runnable { 
    private final int index; 

    public IndexedThread(int index) { 
     this.index = index; 
    } 

    public void run() { 
     // ... 
    } 
} 

कौन इस तरह इस्तेमाल किया जा सकता:

IndexedThread threads[] = new IndexedThread[N]; 

for (int i=0; i<threads.length; i++) { 
    threads[i] = new IndexedThread(i); 
} 
संबंधित मुद्दे