2011-04-01 17 views
7

मैं कॉल() से 2 डी सरणी वापस करने की कोशिश कर रहा हूं, मुझे कुछ समस्याएं हैं। मेरा कोड अब तक है:कॉल करने योग्य से ऑब्जेक्ट कैसे वापस करें()

//this is the end of main 
Thread t1 = new Thread(new ArrayMultiplication(Array1, Array2, length)); 
t1.start(); 
} 

    public int[][] call(int[][] answer) 
    {  

    int[][] answer = new int[length][length]; 

    answer = multiplyArray(Array1, Array2, length); //off to another function which returns the answer to here 

    return answer;         
    } 

यह कोड संकलित करता है, यह मेरी सरणी वापस नहीं कर रहा है। मुझे यकीन है कि मैं शायद गलत वाक्यविन्यास का उपयोग कर रहा हूं, लेकिन मुझे कोई अच्छा उदाहरण नहीं मिल रहा है।

संपादित करें: यह थोड़ा

+0

यह क्या लौटा रहा है? लंबाई कहाँ से आ रही है? Array1 और Array2 कहां से आ रहे हैं? –

+0

मुझे पूरा यकीन है कि 'answer = multiplyArray (Array1, Array2, लंबाई,);' एक अतिरिक्त ', 'के बाद संकलित नहीं होगा। आपको अधिक कोड पोस्ट करना चाहिए, क्योंकि मुझे नहीं लगता कि अनुमान लगाने के बिना यहां एक धारणा बनाना संभव है। –

+0

कॉल() विधि का आविष्कार क्या कर रहा है? – dontocsata

उत्तर

5

यूसुफ Ottinger के जवाब देने के लिए जोड़ा जा रहा है, मूल्यों प्रतिदेय की कॉल के अंदर() विधि प्रयोग की जाने वाली है, तो आप को बंद का उपयोग कर सकते पारित करने के लिए:

public static Callable<Integer[][]> getMultiplierCallable(final int[][] xs, 
      final int[][] ys, final int length) { 
     return new Callable<Integer[][]>() { 
      public Integer[][] call() throws Exception { 
       Integer[][] answer = new Integer[length][length]; 
       answer = multiplyArray(xs, ys, length); 
       return answer; 
      } 
     }; 
    } 

    public static void main(final String[] args) throws ExecutionException, 
      InterruptedException { 
     final int[][] xs = {{1, 2}, {3, 4}}; 
     final int[][] ys = {{1, 2}, {3, 4}}; 
     final Callable<Integer[][]> callable = getMultiplierCallable(xs, ys, 2); 
     final ExecutorService service = Executors.newFixedThreadPool(2); 
     final Future<Integer[][]> result = service.submit(callable); 
     final Integer[][] intArray = result.get(); 
     for (final Integer[] element : intArray) { 
      System.out.println(Arrays.toString(element)); 
     } 
    } 
+0

मुझे यूसुफ ओटिंगर और मारिमुथु मदसामी दोनों के लिए बहुत बड़ा धन्यवाद कहना है। मैं आपकी सहायता से अंत में वहां गया। – user650309

9

बदल यहाँ प्रतिदेय < के कुछ कोड का प्रदर्शन फायदा नहीं है> इंटरफ़ेस:

public class test { 
public static void main(String[] args) throws ExecutionException, InterruptedException { 
    Callable callable = new Callable() { 
     @Override 
     public int[][] call() throws Exception { 
      int[][] array = new int[5][]; 
      for (int i = 0; i < array.length; i++) { 
       array[i] = new int[]{5 * i, 5 * i + 1, 5 * i + 2, 5 * i + 3}; 
      } 

      return array; 
     } 
    }; 

    ExecutorService service = Executors.newFixedThreadPool(2); 
    Future<int[][]> result = service.submit(callable); 

    int[][] intArray = result.get(); 
    for (int i = 0; i < intArray.length; i++) { 
     System.out.println(Arrays.toString(intArray[i])); 
    } 
} 
} 

क्या करता है एक वस्तु है कि एक प्रबंधक सेवा करने के लिए प्रस्तुत किया जा सकता का निर्माण है। यह मौलिक रूप से एक रननेबल जैसा ही है, सिवाय इसके कि यह एक मूल्य वापस कर सकता है; हम यहां क्या कर रहे हैं एक निष्पादक सेवा दो धागे के साथ बना रहा है, फिर सेवा के लिए यह कॉल करने योग्य सबमिट कर रहा है।

अगली चीज़ जो होती है वह परिणाम है .get(), जो कॉल करने योग्य रिटर्न तक अवरुद्ध होगा।

आपको शायद थ्रेड प्रबंधन स्वयं नहीं करना चाहिए।

+0

यह बहुत उपयोगी है, लेकिन कॉल करने योग्य ऑब्जेक्ट को ऑब्जेक्ट्स भेजना संभव है? मुझे इसके लिए दो सरणी भेजने की जरूरत है। – user650309

+0

आप उन्हें निर्माण में पास कर सकते हैं, या उदाहरण-स्थानीय सरणी का उपयोग करने के लिए कॉल करने योग्य इंटरफ़ेस का विस्तार कर सकते हैं। –

+0

एक्जिक्यूटर्स सेवा उपयोग को बढ़ावा देने के लिए महान उत्तर, और कुडोस। वहां वास्तव में कई जगहें नहीं हैं जिन्हें किसी को कभी भी थ्रेड का उपयोग करना चाहिए। –

2

यूसुफ के उत्कृष्ट उत्तर के अलावा, ध्यान दें कि आपकी विधि हस्ताक्षर int[][] call(int[][]) है। यदि आप Callable जावाडोक का संदर्भ देते हैं तो आप देखेंगे कि Callable की call() विधि कोई तर्क नहीं लेती है। तो आपकी विधि एक ओवरलोड है, ओवरराइड नहीं है, और इसलिए Callable की call() विधि को कॉल करने वाली किसी भी चीज़ से नहीं बुलाया जाएगा।

+0

हे, धन्यवाद। मुझे लगा कि वास्तव में (थोड़ा अधूरा) उदाहरण कोड में क्या चल रहा था, यह जानने के बजाय सही उपयोग दिखाना आसान था। –

+0

जर्मन के रूप में कहते हैं: "दा लेगेट डेर हुंड begraben" - यह वह जगह है जहां समस्या निहित है। –

संबंधित मुद्दे