假设我想在java中打印文本提示,然后从System.in获取用户的输入。但另一个线程可以写入System.out并“取消”输入但文本提示保持不变,这是正常的。
在此输入输入 - >
<waiting for input ...>
但是如果一个线程写出了以下内容:
在此输入输入 - &gt;
...
...
...
这里的螺纹输出
...
...
<Waits for input here>
是否有任何技巧可以将输入与提示文本“绑定”?
答案 0 :(得分:2)
是否有任何技巧可以将输入与提示文本“绑定”?
不。这是你的代码;你应该和自己合作。这可能意味着围绕System.(in|out)
构建(或找到提供的库)包装器API,这样您就不必担心意外导致此问题。但不,没有神奇的银弹。
答案 1 :(得分:2)
您可以将system.outs包装到日志记录类中,当您想要打印某些内容时,将其添加到新日志记录类中的队列中。
当你要求用户输入时,让它在日志记录类中激活一个锁,这样在提交用户输入之前队列中的任何内容都不会打印,然后打印队列中的所有输出。
这将导致所有输出文本在输入进入时暂停。它不会中断您的输入,因此输入将绑定在光标周围,但您也不会获得任何输出。如果值得的话,由你决定。
答案 2 :(得分:1)
我不确定是否存在任何现有实现,但此任务应该足够简单。
创建一个类,例如SyncConsole,它可以同步您的打印和读取。
在代码中基本上只有SyncConsole单例,可以写入和读取控制台的io流。
然后您的程序可以执行类似
的操作SyncConsole.readInput("Text to display");
SyncConsole.print("Text");
然后可以正确同步这些呼叫以满足您的需求。例如,如果某些代码请求输入,缓冲请求打印直到收到输入等等。
如果您熟悉java中的并发性,那么构建它应该非常简单,并且会为您提供所需的行为。
答案 3 :(得分:1)
import java.util.LinkedList;
import java.util.Queue;
public class MainDemo {
public void queueExample() {
Queue queue = new LinkedList();
queue.add("Java");
queue.add("DotNet");
queue.offer("PHP");
queue.offer("HTML");
System.out.println("remove: " + queue.remove());
System.out.println("element: " + queue.element());
System.out.println("poll: " + queue.poll());
System.out.println("peek: " + queue.peek());
}
public static void main(String[] args) {
new MainDemo().queueExample();
}
}