2012-08-09 166 views
0

現在,我有一段代碼聯繫另一個服務器,詢問某個項目是否在列表中,並根據返回的值返回布爾值。在Java內返回之前等待

的代碼都像這樣:

public boolean checkIfOnline(int accountId) { 
    //First loop is incase if someone is already checking. Second is for the checking that this account is doing. 
    while (isCheckingIfOnline) { 
     try { 
      Thread.sleep(1); 
     } catch (InterruptedException ex) { 
     } 
    } 
    isCheckingIfOnline = true; 
    sendCheckIfOnline(accountId); 
    while (isCheckingIfOnline) { 
     try { 
      Thread.sleep(1); 
     } catch (InterruptedException ex) { 
     } 
    } 
    return onlineResponse; 
} 

的onlineResponse和isCheckingIfOnline是處理其他的什麼服務器返回的方法中改變,這是我扔在一起讓系統等待的方法另一臺服務器進行響應。顯然,這是非常有缺陷的,因爲當這個方法經常被調用時,它會減慢系統,因爲它一次只允許一個查詢,當它允許多個查詢同時執行時。

我可以使用什麼其他方法來實現上述代碼的功能,但允許多個查詢同時運行?

編輯:爲了進一步說明,checkIfOnline獲取一個帳戶ID,並詢問另一個服務器是否該帳戶ID位於列表中,如果帳戶ID是或不在列表中,則該其他服務器對當前服務器作出響應。

+1

我想你想使用一個ExecutionService並提交「checkIfOnline」任務到它。它負責調度和等待,然後您可以配置適合您的應用程序的併發級別。 – Thilo 2012-08-09 04:54:22

+2

如果沒有sendCheckIfOnline正在做什麼的更多細節,很難提供建議。 – Tom 2012-08-09 04:59:18

+0

超前,澄清更多的湯姆。 – PuppyKevin 2012-08-09 05:18:52

回答

2

聽起來像你想在Java 6 +中使用ExecutorService

ExecutorService要求您提交一個實現Callable的類。當您向ES提交Callable時,您會收到一個Future,您可以使用它來執行一些操作,包括取消流程或從完成的流程中獲取結果。

對於我來說,有點難以理解你想要用你的代碼實現什麼,以及你爲什麼要對那個特定部分進行線程化。話雖這麼說,如果你想達到的併發那裏,你必須:

  1. 提交贖回來,做在線檢查&查詢ES;
  2. 爲Callable提供了一種通知應用程序它已完成執行的方法。

僅僅提交任務並在其上調用Future.get()是不夠的,因爲任何線程都會暫停該任務,直到任務完成。

您需要允許Callable調用回調函數,或者線程執行提交任務的類,並允許它坐下並等待future.get()方法返回結果。

祝你好運:)

+0

你可以提供一個例子嗎? – 2016-11-01 14:13:56

相關問題