Разве Java не делает вещи асинхронно? - PullRequest
3 голосов
/ 25 июня 2009

Я пытаюсь изучать Java, я читал учебник, в котором говорилось что-то вроде этого:

while (N <= 0) {
           TextIO.put("The starting point must be positive. Please try again: ");
           N = TextIO.getlnInt();
        }

Похоже, что когда вы спрашиваете пользователя о вводе, он приостанавливается до получения ответа? Я привык к тому, что все это происходит асинхронно. Это нормально для Java? или вы можете сделать оба?

Спасибо.

Ответы [ 6 ]

5 голосов
/ 25 июня 2009

Я не знаком с этой библиотекой TextIO, но при вызове InputStream.read () , т. Е. При использовании System.in.read(), он будет блокироваться, пока не будут доступны входные данные. Это делает его синхронным.

Вы можете избежать этого (т.е. сделать его асинхронным), используя другой поток для захвата ввода.

3 голосов
/ 25 июня 2009

Ваш класс отправки / получения может иметь следующую форму (по-старому):

class Sender {

    Integer N = null;
    boolean running;

    public void request(byte [] re) {
        new Thread() {
             public void run() {
                 if(!running)
                     running = true;
                 else
                     synchronized(Sender.this) {try {Sender.this.wait(); }catch(Exception e){}}
                 TextIO.put("The starting point must be positive. Please try again: ");
                 N = TextIO.getlnInt();
                 running = false;
                 synchronized(Sender.this) {try {Sender.this.notify(); }catch(Exception e){}}
             }
        }.start();
    }

    public boolean hasResponse() {
        return N != null;
    }

    public int getResponse() {
        return N.intValue();
    }

}

Я полностью рекомендую эту книгу: Java NIO от O'Reilly. Это полнофункциональная книга для синхронного и асинхронного ввода-вывода.

3 голосов
/ 25 июня 2009

Для асинхронного ввода-вывода есть java.nio. Но да, синхронный ввод-вывод типичен для Java.

2 голосов
/ 25 июня 2009

Чтобы это работало так, как вы хотите (я предполагаю, что у вас есть другие части приложения, которые вы хотите продолжать работать, например, графический интерфейс), вам понадобится многопоточность.

Реализация TextIO действительно будет решающим фактором, но в приведенном выше конкретном примере кода цикл while зависит от этого ввода, поэтому в этой точке придется делать паузу независимо от многопоточности.

1 голос
/ 25 июня 2009

.. или вы можете сделать оба?

Вы можете сделать оба.

Обычно этот класс должен использовать какое-то стандартное входное чтение, которое по умолчанию блокирует, но вполне возможно иметь неблокирующее чтение потоков.

Если вы опубликуете фактический код, мы могли бы предложить более подробное объяснение.

0 голосов
/ 25 июня 2009

Да, это в значительной степени так и происходит. Если вы хотите сделать это асинхронно, вы можете создать get в отдельном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...