假设我想在 java 中打印一个文本提示,然后从 System.in 获取用户的输入。但是另一个线程可以写入 System.out 并“删除”输入,但文本提示仍然存在,这是正常的。
在此处输入输入 ->
<waiting for input ...>
但是如果一个线程写了一些东西,就会发生以下情况:
在此处输入输入 ->
...
...
...
此处为线程输出
...
...
<Waits for input here>
是否有任何技巧可以将输入与提示文本“绑定”?
假设我想在 java 中打印一个文本提示,然后从 System.in 获取用户的输入。但是另一个线程可以写入 System.out 并“删除”输入,但文本提示仍然存在,这是正常的。
在此处输入输入 ->
<waiting for input ...>
但是如果一个线程写了一些东西,就会发生以下情况:
在此处输入输入 ->
...
...
...
此处为线程输出
...
...
<Waits for input here>
是否有任何技巧可以将输入与提示文本“绑定”?
您可以将 system.outs 包装到日志记录类中,当您想要打印某些内容时,将其添加到新日志记录类的队列中。
当您要求用户输入时,让它激活日志记录类中的锁,以便在提交用户输入之前不会打印队列中的任何内容,然后打印队列中的所有输出。
这将导致所有输出文本在输入进入时暂停。它不会中断您的输入,因此输入将绑定在光标周围,但您也不会得到任何输出。这取决于你是否值得。
是否有任何技巧可以将输入与提示文本“绑定”?
没有。这是你的代码;与自己合作取决于您。这可能意味着构建(或查找提供)包装 API 的库,System.(in|out)
因此您不必担心意外导致此问题。但是不,没有神奇的银弹。
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();
}
}
我不确定是否存在任何现有的实现,但这个任务应该足够简单。
创建一个同步打印和读取的类,例如 SyncConsole。
基本上只有 SyncConsole 单例在您的代码中写入和读取控制台的 io 流。
然后你的程序可以做类似的事情
SyncConsole.readInput("Text to display");
SyncConsole.print("Text");
然后可以正确同步这些调用以满足您的需求。例如,如果某些代码请求输入,缓冲区请求打印直到输入被接收等等。
如果您熟悉 java 中的并发性,那么构建起来应该相当简单,并且会给您所需的行为。