当前位置: 首页 > 面试题库 >

如何中断java.util.Scanner nextLine调用

沈良策
2023-03-14
问题内容

我正在使用多线程环境,其中一个线程通过反复调用不断侦听用户输入scanner.nextLine()。为了结束应用程序,该运行循环由另一个线程停止,但是直到最后一次用户输入(由于的阻塞性质nextLine()),监听线程才会停止。

由于我正在从中读取内容System.in,因此关闭流似乎不是一种选择,它返回InputStream是不可关闭的。

有没有一种方法可以中断扫描程序的阻塞,使其返回?

谢谢


问题答案:

该文章描述了一种避免读取时阻塞。它提供了代码片段,您可以按我在注释中指出的进行修改。

import java.io.*;
import java.util.concurrent.Callable;

public class ConsoleInputReadTask implements Callable<String> {
  public String call() throws IOException {
    BufferedReader br = new BufferedReader(
        new InputStreamReader(System.in));
    System.out.println("ConsoleInputReadTask run() called.");
    String input;
    do {
      System.out.println("Please type something: ");
      try {
        // wait until we have data to complete a readLine()
        while (!br.ready()  /*  ADD SHUTDOWN CHECK HERE */) {
          Thread.sleep(200);
        }
        input = br.readLine();
      } catch (InterruptedException e) {
        System.out.println("ConsoleInputReadTask() cancelled");
        return null;
      }
    } while ("".equals(input));
    System.out.println("Thank You for providing input!");
    return input;
  }
}

您可以直接使用此代码,也可以编写一个新的可关闭的InputStream类,以结束本文介绍的逻辑。



 类似资料:
  • 问题内容: 我需要制作一个具有同步和异步功能的库。 -等到得到结果,然后返回结果。 -立即返回Future,如果需要,可以在完成其他操作后进行处理。 我图书馆的核心逻辑 客户将使用我们的库,他们将通过传递构建器对象来调用它。然后,我们将使用该对象构造一个URL,并通过执行该对象来对该URL进行HTTP客户端调用,并在将响应作为JSON字符串返回给我们之后,通过创建对象将该JSON字符串发送回给我们

  • 问题内容: 我的用户空间应用程序有时会在收到EINTR信号后以某种方式阻塞。 我用strace记录的内容: 我可以捕获EINTR信号吗,如何重复有关的调用,例如写入,读取或选择?即使使用与系统调用一起使用的第三方库,我如何确定EINTR发生在哪里? 为什么收到EINTR后我的应用程序被完全阻止(请参阅strace转储:我发送了SIGUSR1,通常应该处理)?为什么futex()将ERESTARTS

  • 我需要使一个库,我将有同步和异步的特点。 -等待得到结果,返回结果。 -立即返回一个将来值,如果需要,该将来值可以在其他事情完成后处理。 my Library的核心逻辑 将执行实际任务的简单类: 当我开始处理此解决方案时,我并没有终止超时的任务。我向客户机报告超时,但任务继续在线程池中运行(可能会长时间占用我有限的10个线程中的一个)。所以我在网上做了一些研究,我发现我可以通过使用取消未来来取消超

  • 本文向大家介绍Linux被中断的系统如何调用详解,包括了Linux被中断的系统如何调用详解的使用技巧和注意事项,需要的朋友参考一下 前言 慢系统调用,指的是可能永远无法返回,从而使进程永远阻塞的系统调用,比如无客户连接时的accept、无输入时的read都属于慢速系统调用。 在Linux中,当阻塞于某个慢系统调用的进程捕获一个信号,则该系统调用就会被中断,转而执行信号处理函数,这就是被中断的系统调

  • 问题内容: 这是成功的send()是“原子的”吗?,因为我认为它实际上实际上涉及系统调用,而不仅仅是在套接字上发送。 哪些系统调用可以被中断,何时中断,中断在哪里处理?我已经了解了SA_RESTART,但并不完全了解发生了什么。 如果我在没有SA_RESTART的情况下进行系统调用,该调用是否可以被与我的应用程序无关但需要操作系统中止我的调用并执行其他操作的任何类型的中断(例如,用户输入)中断?还

  • 问题内容: 是否存在禁用节点调试器的“第一行中断”功能的命令行参数或环境变量? 问题答案: 根据这个问题,我已经在节点存储库中打开了,目前,这是不可能的。这也是节点人员不认为值得实现的功能, “因为它似乎毫无意义。[…]附加到正在运行的进程上确实可以做到” 。请参阅提到的问题中的其余讨论。 如果您认为自己想要这样的功能,请对此进行投票,在Github问题上发表评论,如果没有回应,请打开一个新功能,