【发布时间】:2013-12-12 19:49:38
【问题描述】:
我正在开发一个应用程序(控制台),其中包含一个我希望允许用户暂停和恢复的 while 循环。经过一些研究,似乎一个额外的线程负责等待用户输入是正确的解决方案。
我已经能够实现持续等待输入的附加线程,并且还有一个 kill 方法,它设置标志变量以停止线程 while() 循环。不幸的是,由于除非有输入,否则 while 循环不会结束,因此只有在输入线程的 while 循环至少完成一次后,此终止标志才会生效。由于主线程在自己的循环结束时也期望输入,因此用户的输入由输入线程获取,导致主线程的 Scanner 错过输入,除非输入两次。有什么方法可以立即终止输入线程的 while() 循环,而无需完成一次迭代?是否需要某种超时功能?我已经在下面发布了相关代码:
新线程的 InputReader 可运行代码:
public class ReadInput implements Runnable
{
private static volatile boolean running = true;
Scanner user_input = new Scanner(System.in);
public void run()
{
while(running)
{
System.out.println("ReadingInput Input Value: " + user_input.nextLine());
}
}
public void kill()
{
running = false;
System.out.println("Thread Killed.");
}
}
主线程代码:
//Start reader thread in order to scan for input without stopping main code
ReadInput reader = new ReadInput();
Thread reader_thread = new Thread(reader);
reader_thread.start();
while(code_available_for_processing)
{
//Main Thread while() loop processing
}
//STOP Input Reader Thread before main thread requests input
reader.kill();
//Request user input for program re-run
【问题讨论】:
-
首先 - 你需要在应用程序终止之前杀死它吗?如果你这样做,你可以尝试关闭标准输入?没试过,不知道会怎样。也许它会抛出线程,或者只是在没有输入的情况下返回 - 其中任何一个都可以,并允许您检查运行标志。可能值得一试:)
-
需要从标准输入stackoverflow.com/questions/2249680/…非阻塞读取
标签: java multithreading