【问题标题】:closing scanner (or underlayer inputStream) while waiting for user input在等待用户输入时关闭扫描仪(或底层 inputStream)
【发布时间】:2018-06-05 22:42:08
【问题描述】:

我有一个场景,计算机与人类玩家玩井字游戏。用户在通过 Scanner obj 读取的控制台 (System.in) 上输入输入。在每一步之后,程序会决定是否有任何玩家可以做出让游戏更接近获胜的一步(获胜者可能是人类或计算机,没关系)。 我遇到的问题是,在程序决定游戏进入死胡同后(无论玩家采取什么行动,游戏都无法获胜),它会终止所有线程,除了等待用户的线程Scanner 对象上的输入。这导致我的程序挂起,直到用户输入某些内容。我想避免这种情况。 我的问题是:我可以在等待用户通过 inputStream 输入时关闭/终止线程吗? 我尝试以编程方式关闭扫描仪/底层 System.in 流/中断线程,但没有一个使线程脱离“等待用户输入”状态。

扫描仪:

private Scanner scanner = new Scanner(System.in);

人类玩家线程(在宣布获胜者或裁判判定没有玩家获胜时等待用户输入):

    @Override
        public void run() {
            while (!Refree.isWinnerIdentified()) {
                try {
                    System.out.println("Enter next cell location : ");
/*
while execution is waiting on below line for user inputs, all other threads sense that winner is identified and exit. This thread stays in limbo waiting for user inputs
*/
                    String location = scanner.nextLine();

                    //some other code...
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

        }

【问题讨论】:

标签: java multithreading java.util.scanner


【解决方案1】:

您是否尝试在“运行”执行终止后执行scanner.close()?

【讨论】:

  • 运行执行不会终止。这是主要的担忧。正如我所提到的,寻求用户输入的线程正在轮询出现在 System.in 上的内容。与此同时,比赛结束。因此,用户输入线程仍在等待,而其余线程退出 run() 方法。
  • 这行不通,因为您仍然会看到扫描程序等待用户输入,直到扫描程序读取字符串代码不会从 nextLine() 调用移动
【解决方案2】:

您始终可以在等待 Scanner 输入的线程上调用 interrupt,这将强制线程从阻塞操作中恢复。

【讨论】:

  • 阻塞读不能被Thread.interrupt()打断
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多