Java 单独线程是通过按键终止后台任务的好策略吗?

Java 单独线程是通过按键终止后台任务的好策略吗?,java,console,kbhit,Java,Console,Kbhit,我有一个控制台Java应用程序,它在后台执行一些任务。Java不支持console kbhit()测试键盘缓冲区中是否有内容,我知道所有控制台读取和测试都被阻塞 我要做的是用console.readLine()之类的东西启动一个后台线程,然后在这个阻塞调用完成后放置一些终止标志。应用程序后台任务将检查此标志并决定是否需要终止 顺便说一句,我的应用程序将在工作期间写入控制台(通过logback等方式进行日志记录),但从未读取它 这样的策略好吗?您可以使用System.in.available()>

我有一个控制台Java应用程序,它在后台执行一些任务。Java不支持console kbhit()测试键盘缓冲区中是否有内容,我知道所有控制台读取和测试都被阻塞

我要做的是用console.readLine()之类的东西启动一个后台线程,然后在这个阻塞调用完成后放置一些终止标志。应用程序后台任务将检查此标志并决定是否需要终止

顺便说一句,我的应用程序将在工作期间写入控制台(通过logback等方式进行日志记录),但从未读取它


这样的策略好吗?

您可以使用
System.in.available()>0
但这只会缓冲控制台中的完整行(按enter键后)给我,为
控制台指定一个线程。readLine()
听起来是个不错的方法……您测试过吗?您唯一需要担心的是在标志上同步。@sthupahsmat哪个标志?控制台已经在Java中进行了同步,我引用“我要做的是用类似Console.readLine()的东西启动一个后台线程,然后在这个阻塞调用完成后放置一些终止标志。应用程序后台任务将检查这个标志并决定是否需要终止。”@sthupahsmat啊,好吧,但是,如果它只由一个线程(等待控制台输入的线程)编写,那么同步它有什么意义呢?所有其他人都会读它。至少声明它是volatile,否则您将面临永远看不到新值的风险。如果只按Enter键怎么办?available()是否返回大于0的内容?是的System.in也会缓冲换行符,因此按enter键将使1(或windows中的2)可用