2012-12-27 23 views
6

Java programlamada yeniyim. İki db sorgusu yürütmem gereken bir kullanım vaktim var. Dersimde yapısı böyle bir şeydir: Java'da en iyi uygulamaların çoğaltılması

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

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

Şimdi bu 2 işlevleri çağıran aynı sınıfta bir eklenti başka fonksiyon func_3 var ama aynı zamanda paralel yürütmek emin olur. Bunun için, kullanabileceğiniz callables ve futures. Bu şekilde kullanmak için doğru yolu var mı? Bu değişkeni geçici bir değişkende saklıyorum ve daha sonra func_1 ve func_13 ile func_23'ü çağırmak için bunu kullanıyorum (ki bu doğru bir yaklaşım olduğundan emin değilim). Ya da bu gibi davaları halletmenin başka bir yolu var mı?

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

"Java programlamada yeniyim" = false :) –

+1

Sanırım sorun yok. Ancak, aynı zamanda func_1 ve func_2 işlevlerinde kullanılan paylaşılan mülkler konusunda da dikkatli olmalısınız. –

+4

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

cevap

5

Her şeyden önce, başka bir yerel değişkende saklamak gerekmediğini: dış işlevler sadece func_1() veya func_2() ve dış sınıfının this almak istediğinizde sadece A.this kullandıkça satışa sunulacak. İkinci olarak, evet, bunu yapmanın yaygın bir yolu vardır. Ayrıca, eğer func_3'ü sık sık arayacaksanız - sabit iplik havuzunun oluşturulmasından kaçının, sadece paramik olarak geçmelisiniz, çünkü iplik üretimi oldukça maliyetlidir.

0

Executor (Hizmet) ile ilgili tüm fikir, çok sayıda küçük görev için az sayıda iş parçacığı kullanmaktır. Burada 2 görev için 2 iş parçacıklı yürütücüyü kullanın. Global olarak tanımlanmış bir uygulayıcı oluşturabilir veya 2 görev için 2 iş parçacığı oluşturabilirim.