Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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 编程一个循环,直到你们把东西输入控制台_Java_While Loop_Console_Java.util.scanner - Fatal编程技术网

Java 编程一个循环,直到你们把东西输入控制台

Java 编程一个循环,直到你们把东西输入控制台,java,while-loop,console,java.util.scanner,Java,While Loop,Console,Java.util.scanner,我试图构建一个循环,当我在控制台中输入文本时,它会执行一个特定的方法。 我想使用java.util.Scanner,但当我尝试使用.hasNext()检查if()内部,然后使用.next()获取输入时,它会等待,直到我输入某个内容,而不是循环 while(true) { main_loop(); } private void main_loop() { do_other_things(); if(sc.hasNext()){ System.out.pr

我试图构建一个循环,当我在控制台中输入文本时,它会执行一个特定的方法。 我想使用java.util.Scanner,但当我尝试使用.hasNext()检查if()内部,然后使用.next()获取输入时,它会等待,直到我输入某个内容,而不是循环

while(true) {
    main_loop();
}

private void main_loop() {
    do_other_things(); 
    if(sc.hasNext()){
        System.out.println("user entered " + sc.next());
    } else {
        System.out.println("user entered nothing");
    }
}

如何使其输出“用户输入的内容”,直到我输入内容,以便它输出“用户输入的[…]”,然后继续执行“用户输入的内容”?

使用另一个线程:

public static void main(String[] args) {
    new Thread(() -> {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            if (scanner.hasNext()) {
                //... user has input
            }
            else {
                //... user does not have input
            }
    }).start();
    doSomethingElse();
}

您需要运行一个单独的线程来等待输入,然后(如果您希望在用户输入第二个字符串时触发该线程),在处理完输入后,再次安排可运行线程

    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    Scanner scanner = new Scanner(System.in);
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if (scanner.hasNext()) {
                String st = scanner.next();
                //do something now the user has inputted
                System.out.printf("The user entered a string! (%s)", st);

                //run the runnable to wait again
                executorService.schedule(this, 0, TimeUnit.SECONDS);
            }
        }
    };
    executorService.schedule(runnable, 0, TimeUnit.SECONDS);
}

扫描仪就是这样工作的。它等待正确的输入,阻塞线程。我建议您使用一个
新线程()
。您需要使用第二个线程来执行此任务,其中一个线程用于保持while循环
executorService.schedule(this,0,TimeUNit.SECONDS)
,与线程内部的
while(true)
相比,这有什么好处?(真正的问题,我对Java的Executor服务很陌生)您可以使用任何一种,这是一种个人偏好。但是,如果您想添加更多功能,例如“冷却”,那么这将提供更大的灵活性,您可以更改重新运行线程的延迟。另一方面,
while(true)
更干净。有些人认为<代码>(真)不好的实践,尽管它有优点和缺点,但它是基于意见的。我只是在这里写的(真的)…里面有一个布尔值,用来触发它从里面离开。