【问题标题】:java make a method wait for a response of another processjava让一个方法等待另一个进程的响应
【发布时间】:2017-10-05 14:52:13
【问题描述】:

在我的程序中,我连接到另一种语言的解释器进程。有时我需要程序向解释器询问几件事并使用它的响应。

进程存储在 IProcess 变量中,通信是通过进程的 IStreamsProxy 完成的。为了接收响应,我向 IStreamsProxy 添加了一个 IStreamListener。

但是,当我写入 IStreamsProxy(使用 write() 方法)时,我需要代码来等待响应,例如要调用的侦听器的 streamAppend 方法。

我尝试使用 wait() 和 notify() 方法,但我不知道应该调用什么对象。

进行通信的查询类调用这样的方法:

/**
 * Sends a command to the interpreter. Makes the current thread wait for an answer of the interpreter.
 * @throws IOException 
 */
private synchronized void send(String command) throws IOException{
    this.s48Proxy.write(command);
    try {
        System.out.println("waiting for reply");
        this.wait();
    } catch (InterruptedException e) {
        System.out.println("interruption exception: "+e.getMessage());
    }
}

和听众:

private class Listener implements IStreamListener {

    private Query query;

    public Listener(Query query) {
        super();
        this.query = query;
    }

    @Override
    public void streamAppended(String arg0, IStreamMonitor arg1) {
        System.out.println("got interpreter answer");
        query.setCurrentOutput(arg0.substring(0, arg0.lastIndexOf("\n")).trim());
        query.notify();
    }
}

streamAppend() 方法调用查询类的notify()-方法。但是,这不起作用。 “等待回复” 是我得到的最后一个回复。

我该怎么做?或者我可以使用其他任何方法来自动实现这一点?

【问题讨论】:

    标签: java process response wait


    【解决方案1】:

    你可以使用Object#wait & Object#notifiy

    // @ IStreamsProxy
    synchronized( someMonitor ) {
      someMonitor.wait( /* time? */ );
    }
    
    // @ Listener
    synchronized( someMonitor ) {
      someMonitor.notify();
    }
    

    ->Javadoc Link

    【讨论】:

    • 是的,我试过这个,但我无法取得任何结果。我将我的问题编辑为我到底做了什么。
    • 你必须确定;当您调用 wait() 时,尚未调用 notify。如果真的调用了 notify() ,您是否尝试过调试?
    • 不,不是,我在上面编辑了我的代码,streamAppend 方法似乎根本没有被调用。
    • 好的,我的解释器代码中有一个错误,现在调用了 notify 方法。但问题是,我现在在调用 notify 时收到 java.lang.IllegalMonitorStateException。
    • 您必须使用我的答案中提供的代码。您忘记同步查询。
    【解决方案2】:

    使用类似布尔型 waitingForResponse 的信号量。拨打电话时将此设置为 true,然后进入

    同时(等待响应){ sleep(99) //应该是您通话的平均响应时间 }

    在您的侦听器中,将 waitinForResponse 设置为 false。

    【讨论】:

    • 可行,但这是一个忙碌的等待。有没有更好的解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2010-09-22
    相关资源
    最近更新 更多