Java不是异步做事吗?

时间:2009-06-24 20:46:54

标签: java asynchronous

我正在努力学习Java,我正在阅读一个类似这样的教程:

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

似乎当您要求用户输入时,它会暂停,直到收到回复为止?我已经习惯了这些异步发生的事情。这对Java来说是正常的吗?或者你可以两个都做?

感谢。

6 个答案:

答案 0 :(得分:5)

我不熟悉TextIO库,但在调用InputStream.read()时,即在使用System.in.read()时,它会阻塞,直到输入数据可用。这使它同步。

您可以通过使用另一个线程捕获输入来避免这种情况(即使其异步)。

答案 1 :(得分:3)

对于异步I / O,有java.nio。但是,同步I / O是典型的Java。

答案 2 :(得分:3)

您的发送/接收课程可能有以下表格(旧方式):

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();
    }

}

我完全推荐这本书:来自O'Reilly的Java NIO。它是同步和异步IO的全功能书籍。

答案 3 :(得分:2)

为了让它按照你想要的方式工作(我假设你有你想要继续运行的应用程序的其他部分,例如GUI),你将需要多线程。

TextIO的实现确实是决定因素,但在上面的特定代码示例中,while循环依赖于该输入,因此无论多线程如何,它都必须在该点暂停。

答案 4 :(得分:1)

  

..或者你能同时做到吗?

你可以做到这两点。

通常该类应该使用某种标准输入读取,默认情况下会阻塞,但很可能会对流进行非阻塞读取。

如果您发布实际代码,我们可以提供更详细的解释。

答案 5 :(得分:0)

是的,这几乎就是这样。如果你想以异步方式进行,你可以在一个单独的线程中创建获取。