2012-12-27 122 views
6

我是Java編程新手。我有一個用例,我必須並行執行2個db查詢。我班的結構是這樣的:java中的多線程最佳實踐

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

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

現在我在它調用這兩個函數相同的類添加另一個功能func_3而且還可以確保它們執行平行。爲此,我正在使用可卡因和期貨。以這種方式使用它是否正確?我將這個變量存儲在一個臨時變量中,然後使用它從func_3調用func_1和func_2(我不確定是否是正確的方法)。還是有任何其他方式來處理這類案件?

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編程新手」= false :) – 2012-12-27 17:01:52

+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個線程。