Java сделать метод ожидания ответа другого процесса - PullRequest
0 голосов
/ 10 октября 2011

В моей программе я подключаюсь к процессу переводчика для другого языка. Мне иногда нужна программа, чтобы спросить переводчика о нескольких вещах и использовать ее ответ.

Процесс сохраняется в переменной IProcess, и связь осуществляется через IStreamsProxy процесса. чтобы получить ответ, я добавил IStreamListener в IStreamsProxy.

Однако, когда я пишу в 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() для класса запросов. Однако это не работает. «Ожидание ответа» - последний ответ, который я получаю.

Как я могу это сделать? Или есть какие-то другие методы, которые я мог бы использовать для достижения этого автоматически?

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Вы можете использовать Object#wait & Object#notifiy.

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

// @ Listener
synchronized( someMonitor ) {
  someMonitor.notify();
}

-> Javadoc Link

0 голосов
/ 10 октября 2011

Используйте семафор, например, логическое ожидание для ответа.Установите это значение true, когда вы делаете свой вызов, затем перейдите к

, тогда как (waitForResponse) {sleep (99) // должно быть вашим средним временем ответа на ваш вызов}

В вашем слушателе,установите для waitinForResponse значение false.

...