2012-04-18 29 views
2

在我的應用程序中,我按照以下方式加載緩存。在Java中同時進行函數調用

  1. 加載用戶緩存loadUserCache();
  2. 加載帳戶緩存loadAccountCache();
  3. 加載客戶緩存loadCustomerCache();

上面的每個調用都涉及到數據庫調用。像智慧一樣,有6-7個電話。

當我的應用程序正在加載時,我必須等待直到緩存被加載。

這些都是一個接一個的順序呼叫。

如果我可以找到一種方法來並行執行這些調用,那麼應用程序加載過程中的等待時間將大幅下降。

有人可以幫我做這種並行呼叫或任何其他替代方法嗎?

在此先感謝。

+0

歡迎併發編程的世界。 – user1329572 2012-04-18 15:21:12

+2

我建議你閱讀關於線程。 – Danny 2012-04-18 15:21:38

+0

您應該閱讀[Java教程](http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html)中的高級併發功能。 – assylias 2012-04-18 15:23:34

回答

7

您正在尋找多線程。看看官方tutorial for concurrency

創建一個Thread,並覆蓋可運行。

當您在線程上調用start()時,每個線程將被調用爲彼此並行。

另一種方法是使用high-level concurrency API,尤其是Executors

但是,您必須確保在並行程序中沒有data races和/或dead-locks! [如果任務之間存在某種依賴關係,這可能並不重要]。

+1

爲什麼在使用執行程序時使用線程(特別是如果他是新併發的)? – assylias 2012-04-18 15:22:47

+0

@assylias:謝謝,我在編輯評論時添加了一個指向高級併發API教程的鏈接。 – amit 2012-04-18 15:24:36

1

爲每個要並行運行的代碼塊啓動一個新線程。

new Thread(new Runnable(){ 
     loadUserCache(); 
    }).start(); 

    new Thread(new Runnable(){ 
     loadAccountCache(); 
    }).start(); 

    new Thread(new Runnable(){ 
     loadCustomerCache(); 
    }).start(); 

或者

new Thread(new Runnable(){ 
     loadUserCache(); 
     loadAccountCache(); 
     loadCustomerCache(); 
    }).start(); 

是,這個總題目可以迅速打開了各種各樣的問題。多線程的代碼可能相當複雜,但在你的情況下,上述可能會很好。

+0

我不會推薦使用線程,當你可以使用更高級別的組件像執行者,你的第二個例子是順序的,而不是併發的。 – assylias 2012-04-18 15:35:06

3

您可以使用執行框架:

public static void main(String args[]) throws InterruptedException { 
    ExecutorService executor = Executors.newFixedThreadPool(3); 
    Runnable user = new Runnable() { 
     @Override 
     public void run() { 
      loadUserChache(); 
     } 
    }; 
    Runnable account = new Runnable() { 
     @Override 
     public void run() { 
      loadAccountCache(); 
     } 
    }; 
    Runnable customer = new Runnable() { 
     @Override 
     public void run() { 
      loadCustomerCache(); 
     } 
    }; 

    executor.submit(user); 
    executor.submit(account); 
    executor.submit(customer); 

    executor.shutdown(); 
    executor.awaitTermination(10, TimeUnit.SECONDS); //handle timeout here 
}