【问题标题】:print is blocking BufferedReader input?print 阻塞了 BufferedReader 输入?
【发布时间】:2019-05-16 13:58:02
【问题描述】:

我正在尝试并行执行我的代码,但现在遇到了问题。 没有并行执行的代码正在等待输入(1),然后他正在打印一些东西(2)。 现在我在计时器(task2)的帮助下并行执行我的代码,对于输入(1)我得到了另一个循环。

现在,如果我尝试写下某些内容但速度不够快,则输入不会读取被任务 2 中断并打印出来的整个输入。

static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static PrintStream out = new PrintStream(System.out);

static void test1(BufferedReader in, PrintStream out) throws IOException {
    String input = in.readLine();
    if (input.equals("test"))
        System.out.println("true input");
    else System.out.println("false input");
}

public static void main(String[] args) throws IOException {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            while (true) {
                System.out.println("print"); 
                Thread.sleep(1000);}}}, 1000);
    while (true)
        test1(in, out);

}

https://imgur.com/iyIdWeA

【问题讨论】:

  • 就像我理解的那样,它在 1000 毫秒后开始,然后进入循环,等待 1000 毫秒,如果没有内部循环,它会进入,打印 -> 等待 1000 毫秒然后退出
  • 你是说in.readLine()返回不完整的行吗?即使您没有按 Enter 也有部分输入?
  • 如果我想写输入“test”,但我只能写“te”,然后打印带有“print”,“te”甚至不计算在内,只有当我写最后一个“st”用回车,“st”算作输入
  • 这似乎不太可能。当您在整个输入提示中打印输出时,它可能看起来很奇怪,但它不应该弄乱您从该输入中读取的内容。
  • 我添加了一张图片,输入是:“test”+enter 不中断,然后“te”等待打印,“st”+enter,最后只是写一些东西,直到打印会阻塞全部然后按回车imgur.com/iyIdWeA

标签: java io bufferedreader


【解决方案1】:

在您按下 Enter 之前,您可以读取单个字符。

StringBuilder strBuilder = new StringBuilder();
char ch;
while((ch = in.read()) != '\n'){
    strBuilder.append(ch);
}
String input = strBuilder.toString();

【讨论】:

  • 那不工作它也像 in.readLine() 一样工作。如果我写下一些东西,那么它仍然不会在打印之前计算输入。 (和图片一模一样)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2018-09-26
  • 2017-05-03
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多