Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待用户输入时关闭扫描仪(或底层inputStream)_Java_Multithreading_Java.util.scanner - Fatal编程技术网

Java 等待用户输入时关闭扫描仪(或底层inputStream)

Java 等待用户输入时关闭扫描仪(或底层inputStream),java,multithreading,java.util.scanner,Java,Multithreading,Java.util.scanner,我有一个场景,电脑和人类玩家玩Tictatcoe游戏。用户在控制台(System.in)上输入,该输入通过扫描仪obj读取。在每一个动作之后,程序都会做出一个决定,是否有玩家可以做出一个使游戏更接近胜利的动作(胜利者可以是人类或计算机,这无关紧要)。 我遇到的问题是,在程序决定游戏已经走到了死胡同(无论玩家做出什么动作,游戏都不能被任何一方赢)之后,它会终止所有线程,只有一个线程在扫描对象上等待用户输入。这会导致我的程序挂起,直到用户输入某些内容。我想避免这种情况。 我的问题是:当线程通过inp

我有一个场景,电脑和人类玩家玩Tictatcoe游戏。用户在控制台(System.in)上输入,该输入通过扫描仪obj读取。在每一个动作之后,程序都会做出一个决定,是否有玩家可以做出一个使游戏更接近胜利的动作(胜利者可以是人类或计算机,这无关紧要)。 我遇到的问题是,在程序决定游戏已经走到了死胡同(无论玩家做出什么动作,游戏都不能被任何一方赢)之后,它会终止所有线程,只有一个线程在扫描对象上等待用户输入。这会导致我的程序挂起,直到用户输入某些内容。我想避免这种情况。 我的问题是:当线程通过inputStream等待用户输入时,我可以关闭/终止线程吗? 我尝试以编程方式关闭扫描仪/参考底图系统.in stream/中断线程,但没有一个线程脱离“等待用户输入”状态

扫描仪:

private Scanner scanner = new Scanner(System.in);
人类玩家线程(当宣布获胜者或裁判判定没有玩家可以获胜时,等待用户输入):


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

您可以随时调用等待扫描仪输入的线程,这将强制线程从阻塞操作恢复。

运行执行不会终止。这是主要关切。正如我提到的,寻找用户输入的线程正在轮询System.in上出现的内容。同时,游戏结束了。因此,用户输入线程仍在等待,而其余线程退出run()方法。这将不起作用,因为扫描器仍将等待用户输入,直到扫描器读取字符串,代码才会从
nextLine()移动。
callBlocking读取不能用
thread.interrupt()中断
    @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();
                }

            }

        }