在Java内返回之前等待

时间:2012-08-09 04:37:00

标签: java wait

现在,我有一段代码与另一台服务器联系,询问项是否在列表中,并根据返回的值返回一个布尔值。

代码如下:

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 个答案:

答案 0 :(得分:2)

听起来你想要使用Java 6+中的ExecutorService

ExecutorService要求您向其提交一个实现Callable的类。当您向ES提交Callable时,您会收到一个Future,您可以使用该{{3}}来执行许多操作,包括取消流程或从已完成的流程中获取结果。

我很难理解您要使用代码实现的目标,以及为什么要对特定部分进行操作。话虽这么说,如果你想在那里实现并发,你必须:

  1. 将一个Callable提交给进行在线检查的ES。查询;
  2. 为Callable提供了一种通知您的应用程序已完成执行的方法。
  3. 仅仅提交任务并在其上调用Future.get()是不够的,因为在该任务完成之前,任何线程都会暂停该调用。

    您需要允许Callable调用回调,或者线程执行任务提交的类并允许它坐下并等待future.get()方法返回结果。

    祝你好运:)