我正在努力学习Java,我正在阅读一个类似这样的教程:
while (N <= 0) {
TextIO.put("The starting point must be positive. Please try again: ");
N = TextIO.getlnInt();
}
似乎当您要求用户输入时,它会暂停,直到收到回复为止?我已经习惯了这些异步发生的事情。这对Java来说是正常的吗?或者你可以两个都做?
感谢。
答案 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)
是的,这几乎就是这样。如果你想以异步方式进行,你可以在一个单独的线程中创建获取。