当前位置: 首页 > 面试题库 >

设计模式以处理Java中的异步响应

孙胜泫
2023-03-14
问题内容

我看到了很多解决方案,但没有一个能让我满意。

监听方式

捕获结果后,将在onResult方法中执行处理。

public interface GeolocationListener {
public void onResult(Address[] addresses);
public void onError(Exception e);
}

这个解决方案并不令我满意,因为我想用main方法处理结果。我讨厌这个接口,因为当返回响应时,它将在onResult中进行处理,从而导致处理链,并且无法返回“
main”方法。

servlet方式

public class SignGuestbookServlet extends HttpServlet {

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws IOException {
        // ...
        resp.sendRedirect("/guestbook.jsp");
    }
}

没有公开的Java代码调用servlet。所有配置都在web.xml中完成

我想要的方式

等待这样的回应

Response a = getResponse();
// wait until the response is received, do not go further
// process
Response b = getResponse();
// wait until the response is received, do not go further
process(a,b);

是否有一种设计模式来处理异步请求并等待上述响应?除了听众以外的其他方式。请没有库或框架。

编辑
到目前为止,谢谢。我没有给你完整的画面,所以我公开了我开始实施的Geolocation类。我不知道如何实现该方法。有人可以显示“如何”吗?他(或她)还必须实现侦听器以检索结果

private Address getFullAddress (String text, AddressListener listener, ... ){

    // new Geolocation(text, listener, options).start() 
    // implements Geolocation.GeolocationListener   
    // how to return the Address from the onResult ?
}

问题答案:

异步代码始终可以使同步。最简单/最简单的方法是进行异步调用,然后进入一个while循环,该循环仅使当前线程休眠,直到返回值为止。

编辑: 将异步回调转换为同步代码的代码-还是粗略的实现:

import java.util.concurrent.*;

public class MakeAsynchronousCodeSynchronous {
    public static void main(String[] args) throws Exception {
        final Listener listener = new Listener();
        Runnable delayedTask = new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    throw new IllegalStateException("Shouldn't be interrupted", e);
                }
                listener.onResult(123);

            }
        };
        System.out.println(System.currentTimeMillis() + ": Starting task");
        Executors.newSingleThreadExecutor().submit(delayedTask);
        System.out.println(System.currentTimeMillis() + ": Waiting for task to finish");
        while (!listener.isDone()) {
            Thread.sleep(100);
        }
        System.out.println(System.currentTimeMillis() + ": Task finished; result=" + listener.getResult());
    }

    private static class Listener {
        private Integer result;
        private boolean done;

        public void onResult(Integer result) {
            this.result = result;
            this.done = true;
        }

        public boolean isDone() {
            return done;
        }

        public Integer getResult() {
            return result;
        }
    }
}

您也可以按照hakon的答案建议使用CountDownLatch。它将做基本上相同的事情。我还建议您熟悉java.util.concurrent包,以获取更好的线程管理方法。最后,仅仅因为您 可以
做到这一点就不是一个好主意。如果您正在使用基于异步回调的框架,那么与学习如何有效使用框架相比,尝试颠覆它可能要好得多。



 类似资料:
  • 问题内容: 我是Node的新手,并试图确保我对JSON驱动的Web应用程序使用了合理的设计。 我已经在Redis中存储了一堆数据,并且正在通过node检索它们,并将结果从Redis中流出来。这是我正在做的一个很好的例子: 本质上,我是从Redis获取一组密钥,然后请求每个密钥,然后将结果流式传输到半手动创建的JSON(来自Redis的字符串已经在JSON中)。现在,这很好用,但是我不禁会以为i =

  • 本文向大家介绍快速理解Java设计模式中的组合模式,包括了快速理解Java设计模式中的组合模式的使用技巧和注意事项,需要的朋友参考一下 组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系。 个人理解:组合模式就是将部分组装成整体。 定义如下: 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具

  • 问题内容: 这是一种常见的模式,我看到与异常关联的错误代码存储为静态最终整数。当创建要抛出的异常时,将使用这些代码之一以及错误消息来构造该异常。这导致该方法要抓住它,必须先查看代码,然后决定采取的措施。 替代方法似乎是-为每个异常错误情况声明一个类(尽管相关的异常会从通用基类中删除) 有中间立场吗?推荐的方法是什么? 问题答案: 这是一个很好的问题。我相信绝对有中间立场。 我认为错误代码对于显示质

  • 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。

  • 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。本教程将通过 Java 实例,一步一步向您讲解设计模式的概念。

  • 代理(Proxy) Intent 控制对其它对象的访问。 Class Diagram 代理有以下四类: 远程代理(Remote Proxy):控制对远程对象(不同地址空间)的访问,它负责将请求及其参数进行编码,并向不同地址空间中的对象发送已经编码的请求。 虚拟代理(Virtual Proxy):根据需要创建开销很大的对象,它可以缓存实体的附加信息,以便延迟对它的访问,例如在网站加载一个很大图片时,