4

假设我想在 java 中打印一个文本提示,然后从 System.in 获取用户的输入。但是另一个线程可以写入 System.out 并“删除”输入,但文本提示仍然存在,这是正常的。

在此处输入输入 ->
<waiting for input ...>

但是如果一个线程写了一些东西,就会发生以下情况:

在此处输入输入 ->
...
...
...
此处为线程输出
...
...
<Waits for input here>

是否有任何技巧可以将输入与提示文本“绑定”?

4

4 回答 4

2

您可以将 system.outs 包装到日志记录类中,当您想要打印某些内容时,将其添加到新日志记录类的队列中。

当您要求用户输入时,让它激活日志记录类中的锁,以便在提交用户输入之前不会打印队列中的任何内容,然后打印队列中的所有输出。

这将导致所有输出文本在输入进入时暂停。它不会中断您的输入,因此输入将绑定在光标周围,但您也不会得到任何输出。这取决于你是否值得。

于 2013-04-14T16:15:50.833 回答
2

是否有任何技巧可以将输入与提示文本“绑定”?

没有。这是你的代码;与自己合作取决于您。这可能意味着构建(或查找提供)包装 API 的库,System.(in|out)因此您不必担心意外导致此问题。但是不,没有神奇的银弹。

于 2013-04-14T16:12:22.520 回答
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();
    }
}
于 2013-05-09T02:44:44.707 回答
1

我不确定是否存在任何现有的实现,但这个任务应该足够简单。

创建一个同步打印和读取的类,例如 SyncConsole。

基本上只有 SyncConsole 单例在您的代码中写入和读取控制台的 io 流。

然后你的程序可以做类似的事情

SyncConsole.readInput("Text to display");
SyncConsole.print("Text");

然后可以正确同步这些调用以满足您的需求。例如,如果某些代码请求输入,缓冲区请求打印直到输入被接收等等。

如果您熟悉 java 中的并发性,那么构建起来应该相当简单,并且会给您所需的行为。

于 2013-04-14T16:18:23.027 回答