【问题标题】:Java async servlet: Wait for a specific eventJava async servlet:等待特定事件
【发布时间】:2014-07-23 12:10:50
【问题描述】:

编辑: 编辑了问题以响应下面的@maress 答案。

我在 java 中有一个 Web 服务(启用异步),它在调用时会异步执行对另一个服务的调用。在我的控制器中,我有这个:

private boolean receivedEvent = false;
private final Object SYNC = new Object();

public Callable<String> doStuff()
{
     callSomeAsyncFunction();

     return new Callable<String> ()
            {
                @Override
                public String call() throws Exception {

                    synchronized (SYNC)
                    {
                        while (receivedEvent == false)
                        {
                            SYNC.wait();
                        }

                        receivedEvent = false;
                        System.out.println("RETURN");
                        return "ok";
                    }
                }
            };
}

public void onMyEvent(MyEvent event)
    {
        synchronized (SYNC)
        {
            receivedEvent = true;
            System.out.println("RECEIVED");
            SYNC.notify();
        }
    }

编辑:通知永远不会通过。 System.out.println("RETURN") 永远不会被调用。正在接收事件(显示“已接收”)。

现在我要做的就是等待callSomeAsyncFunction() 完成执行。完成后,它会在处理程序 public void onMyEvent(MyEvent event) 上触发一个事件。

有什么建议吗?我什至不确定我的方法是否有意义。

【问题讨论】:

    标签: java multithreading asynchronous wait notify


    【解决方案1】:

    始终在最终实例上同步。

    private MyEvent myEvent;
    private final Object SYNC = new Object();
    
    public Callable<String> doStuff()
    {
         callSomeAsyncFunction();
    
         return new Callable<String> ()
                {
                    @Override
                    public String call() throws Exception {
    
                        synchronized (SYNC)
                        {
                            while (myEvent == null)
                            {
                                SYNC.wait();
                            }
                            return "ok";
                        }
                    }
                };
    }
    
    public void onMyEvent(MyEvent event)
        {
            synchronized (SYNC)
            {
                myEvent = event;
                SYNC.notifyAll();
            }
        }
    

    【讨论】:

    • 谢谢,现在我没有收到任何错误,但通知不起作用。我从来没有达到'return "ok";'
    • 可能是因为 callSomeAsyncFunction() 从不调用你的 onMy/evnt(MyEvent) 函数。
    • 发布整个代码?并且请确保 MyEvent 在调用 onMyEvent(MyEvent) 函数时永远不会为空。
    • 刚刚编辑了问题。我完全删除了对 MyEvent 的处理以避免任何副作用。我只想登录到控制台。还是不行。
    • 什么时候注册callable到回调事件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多