0

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

代码如下:

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 是否在列表中,则该其他服务器会响应当前服务器。

4

1 回答 1

2

听起来您想在 Java 6+ 中使用ExecutorService 。

ExecutorService 要求您向它提交一个实现 Callable 的类。当您向 ES 提交 Callable 时,您会收到一个Future,您可以使用它来做很多事情,包括取消流程或从已完成的流程中获取结果。

我有点难以准确理解你试图用你的代码实现什么,以及你为什么要线程化那个特定的部分。话虽这么说,如果你想在那里实现并发,你必须:

  1. 向执行在线检查和查询的 ES 提交 Callable;
  2. 为 Callable 提供一种方法来通知您的应用程序它已完成执行。

仅仅提交任务并对其调用 Future.get() 是不够的,因为任何进行该调用的线程都将被挂起,直到任务完成。

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

祝你好运 :)

于 2012-08-09T05:20:27.637 回答