大佬教程收集整理的这篇文章主要介绍了停止收听用户输入,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个这样的程序:
import java.util.ScAnner;
class State
{
public volatile static Boolean _userinput = false;
public volatile static Boolean _timeout = false;
}
public class Startup
{
public static voID main(String[] args)
{
class inputListener implements Runnable
{
@OverrIDe
public voID run()
{
System.out.println("Listening for user input...");
ScAnner in = new ScAnner(system.in);
String s = in.next();
in.close();
State._userinput = true;
System.out.println("User input detected,Listener thread shutTing down...");
}
}
class Timeout implements Runnable
{
@OverrIDe
public voID run()
{
try
{
Thread.sleep(2000);
State._timeout = true;
}
catch (InterruptedException E)
{
System.out.println("Timeout thread interrupted");
}
}
}
Thread Listener = new Thread(new inputListener());
Listener.start();
Thread timeout = new Thread(new Timeout());
timeout.start();
while(true)
{
if(State._userinput)
{
System.out.println("Got user input");
timeout.interrupt();
break;
}
if(State._timeout)
{
System.out.println("Timeout");
Listener.interrupt();
break;
}
}
System.out.println("ShutTing down...");
}
}
如您所见,该程序的工作方式如下:启动了两个线程:其中一个在 2 秒后超时,另一个等待用户输入。如果两个线程中的任何一个成功,主线程就会关闭另一个线程并继续前进。这是一个大型项目的简化场景,我基本上等待 a) 用户输入或 b) 外部信号。
用 Thread.interrupt()
中断超时线程效果很好,即使它不是真正必要的,因为它会......好吧......无论如何都会超时。但是,如果先发生超时,Thread.interrupt
将不@H_801_17@终止用户输入侦听器线程。这是一个问题,因为即使主线程完成并且程序应该终止,它也不会终止,因为输入侦听器线程仍然在 ScAnner.next()
调用处被阻塞,而 Thread.interrupt()
什么也不做。我现在已经尝试了几件事,似乎是 impossible
摆脱这个线程,而无需用户在控制台内提供至少一行,我想防止这是必要的。有什么办法可以解决这个问题吗?
我正在制作一个控制台应用程序,所以我不能从其他地方获取输入。
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
以上是大佬教程为你收集整理的停止收听用户输入全部内容,希望文章能够帮你解决停止收听用户输入所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。