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

我正在使用multithreading环境,一个Thread通过反复调用scanner.nextLine()来不断监听用户输入。 要结束应用程序,此runloop由另一个线程停止,但是在最后一次用户输入之前,监听线程不会停止(由于nextLine()的阻塞性质)。

关闭流似乎不是一个选项,因为我从System.in读取,它返回一个不可关闭的InputStream

有没有办法打断扫描仪的阻塞,以便它会返回?

谢谢

本文介绍了一种在阅读时避免阻止的方法。 它给出了代码片段,您可以根据我在评论中指出的内容进行修改。

 import java.io.*; import java.util.concurrent.Callable; public class ConsoleInputReadTask implements Callable { 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类,并结合本文中描述的逻辑。

当然。 使用核武器。 在主线程的末尾调用System.exit(0) 。 这将谋杀一切。 甚至活动线程在System.in中等待。

问题是System.in是一个带阻塞的传统输入流,当它被阻塞时,线程被标记为正在运行。 你不能打断它。 因此,无论您使用什么线程来读取System.in都在调用read,而read将阻塞该线程。 你可以用一堆技巧来哄骗这些东西,避免调用读取,除非在那些情况下我们可以确定不会阻塞然后不断轮询。 但是,没有真正解决问题的方法是,任何尝试读取都将锁定您的线程,没有关闭底层流或中断或停止线程的数量将拯救您。 但是,如果你谋杀整个vm …线程将会死亡。

显然你需要确保其余的线程都已正确退出,这只是一个愚蠢的我想要能够响应最后一个hanger-on的类型输入线程。 但是,如果情况完全如此,那么正确的答案就是退出,或者至少基本上唯一的答案就是在没有理由的情况下无需刻录时钟周期就可以工作,让程序终止。