2012-12-27 6 views
6

में मल्टीथ्रेडिंग सर्वोत्तम प्रथाओं मैं जावा प्रोग्रामिंग के लिए नया हूं। मेरे पास एक उपयोग केस है जहां मुझे समानांतर 2 डीबी क्वेरी निष्पादित करना है। मेरी कक्षा की संरचना कुछ इस तरह है:जावा

class A { 
    public Object func_1() { 
     //executes db query1 
    } 

    public Object func_2() { 
     //executes db query1 
    } 
} 

अब मैं एक ही कक्षा जो इन 2 कार्यों कॉल में एक ऐड एक और समारोह func_3 है, लेकिन यह भी सुनिश्चित करना है कि वे parallely अमल में आता है। इसके लिए, मैं कॉलबेल और वायदा का उपयोग कर रहा हूं। क्या इसका उपयोग इस तरह से करने का सही तरीका है? मैं इस चर को एक अस्थायी चर में संग्रहीत कर रहा हूं और फिर func_1 और func_2 को func_3 से कॉल करने के लिए इसका उपयोग कर रहा हूं (जो मुझे यकीन नहीं है कि सही दृष्टिकोण है)। या ऐसे मामलों को संभालने का कोई और तरीका है?

class A { 
    public Object func_1() { 
     //executes db query1 
    } 

    public Object func_2() { 
     //executes db query1 
    } 

    public void func_3() { 
     final A that = this; 
     Callable call1 = new Callable() { 
      @Override 
      public Object call() { 
       return that.func_1(); 
      } 
     } 

     Callable call2 = new Callable() { 
      @Override 
      public Object call() { 
       return that.func_2(); 
      } 
     } 
     ArrayList<Callable<Object>> list = new ArrayList<Callable<Object>>(); 
     list.add(call1); 
     list.add(call2); 
     ExecutorService executor = Executors.newFixedThreadPool(2); 
     ArrayList<Future<Object>> futureList = new ArrayList<Future<Object>>(); 
     futureList = (ArrayList<Future<Object>>) executor.invokeAll(list); 
     //process result accordingly 
    } 
} 
+1

"मैं जावा प्रोग्रामिंग में नया हूं" = झूठा :) –

+1

मुझे लगता है कि यह ठीक है। लेकिन आपको 'func_1' और 'func_2' में समवर्ती साझा गुणों के बारे में सावधान रहना चाहिए। –

+4

http://www.javaconcurrencyinpractice.com/? – fge

उत्तर

5

पहले सभी की, तो आप एक स्थानीय चर में संग्रहीत कर करने की जरूरत नहीं है: बाहरी कार्यों सिर्फ func_1() या func_2() और जब आप बाहरी वर्ग के this प्राप्त करना चाहते हैं तो आप सिर्फ A.this का उपयोग के रूप में उपलब्ध हो जाएगा।

दूसरा, हाँ, ऐसा करने का यह आम तरीका है। इसके अलावा, अगर आप अक्सर func_3 को कॉल करने जा रहे हैं - निश्चित थ्रेड पूल बनाने से बचें, तो आपको इसे पैराम के रूप में पास करना चाहिए, क्योंकि धागा निर्माण बल्कि 'महंगा' है।

0

निष्पादक (सेवा) का पूरा विचार कई छोटे कार्यों के लिए धागे की छोटी संख्या का उपयोग करना है। यहां आप 2 कार्यों के लिए 2-थ्रेडेड एक्जिक्यूटर का उपयोग करते हैं। मैं या तो विश्व स्तर पर परिभाषित निष्पादक बनाउंगा, या केवल 2 कार्यों के लिए 2 धागे को स्पॉन करूंगा।