2012-08-09 143 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

相关问题