如何停止等待用户输入?
How to stop waiting for user input?
我正在构建一个程序来询问乘法,我想设置一个计时器来强制这个人在给定的时间内给出答案:
- 如果此人在计时器结束前回答:进行下一次乘法
- 如果计时器到达终点,停止等待用户输入:进行下一个乘法
目前,案例1
可以完成,但2
不行,我在想一个办法return;
从线程之类的方法里面,bu不知道怎么样
所以我面临一个问题,如果 Scanner
打开,等待输入,如何停止它?我试过将它放在线程中并 interrupt()
它或使用 boolean
作为标志,但它不会停止 Scanner
class Multiplication extends Calcul {
Multiplication() { super((nb1, nb2) -> nb1 * nb2); }
@Override
public String toString() { return getNb1() + "*" + getNb2(); }
}
abstract class Calcul {
private int nb1, nb2;
private boolean valid;
private boolean inTime = true;
private boolean answered = false;
private BiFunction<Integer, Integer, Integer> function;
Calcul(BiFunction<Integer, Integer, Integer> f) {
this.nb1 = new Random().nextInt(11);
this.nb2 = new Random().nextInt(11);
this.function = f;
}
void start() {
Scanner sc = new Scanner(System.in);
System.out.println("What much is " + this + " ?");
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (!answered) {
inTime = false;
}
}
}, 5 * 1000);
int answer = Integer.parseInt(sc.nextLine());
if (inTime) {
checkAnswer(answer);
timer.cancel();
}
}
private void checkAnswer(int answer) {
System.out.println("You said " + answer);
valid = (function.apply(nb1, nb2) == answer) && inTime;
answered = true;
}
int getNb1() { return nb1; }
int getNb2() { return nb2; }
boolean isValid() { return valid; }
public static void main(String[] args) {
List<Calcul> l = Arrays.asList(new Multiplication(), new Multiplication(), new Multiplication());
l.forEach(Calcul::start);
}
}
你试过用close吗,你可以在时间到了的时候检查一下输入是不是“”然后关闭它,可能会有帮助;
if(scanner!=null)
{
scanner.close();
}
您可以检查 System.in.available() > 0
以查看是否有要读取的行。仅当此 return 为真时才调用 sc.nextLine()
以实际接收输入。
一个例子:
Scanner sc = new Scanner(System.in);
long sTime = System.currentTimeMillis();
while (System.currentTimeMillis() - sTime < 5000)
{
if (System.in.available() > 0)
{
System.out.println(sc.nextLine());
}
}
sc.close();
如果有东西要读,这会从控制台读取 5 秒,然后再次打印出来。 注意:实际使用它时,您可能会在循环中抛出一个 sleep
,以免占用太多系统资源。
请注意,这是一个 可行的 解决方案:available()
往往是一种不可靠的方法,它会进行一些估计并且可能会出错。我可能不会在时间关键的系统等中依赖它
还要进一步扩展,此方法依赖于控制台以 大多数 控制台的工作方式(换句话说:我知道的所有控制台):仅当用户输入换行符(例如按回车键)该行实际上交给 System.in
处理。否则,当只输入一个字符时,available()
已经 return 为真。
我正在构建一个程序来询问乘法,我想设置一个计时器来强制这个人在给定的时间内给出答案:
- 如果此人在计时器结束前回答:进行下一次乘法
- 如果计时器到达终点,停止等待用户输入:进行下一个乘法
目前,案例1
可以完成,但2
不行,我在想一个办法return;
从线程之类的方法里面,bu不知道怎么样
所以我面临一个问题,如果 Scanner
打开,等待输入,如何停止它?我试过将它放在线程中并 interrupt()
它或使用 boolean
作为标志,但它不会停止 Scanner
class Multiplication extends Calcul {
Multiplication() { super((nb1, nb2) -> nb1 * nb2); }
@Override
public String toString() { return getNb1() + "*" + getNb2(); }
}
abstract class Calcul {
private int nb1, nb2;
private boolean valid;
private boolean inTime = true;
private boolean answered = false;
private BiFunction<Integer, Integer, Integer> function;
Calcul(BiFunction<Integer, Integer, Integer> f) {
this.nb1 = new Random().nextInt(11);
this.nb2 = new Random().nextInt(11);
this.function = f;
}
void start() {
Scanner sc = new Scanner(System.in);
System.out.println("What much is " + this + " ?");
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (!answered) {
inTime = false;
}
}
}, 5 * 1000);
int answer = Integer.parseInt(sc.nextLine());
if (inTime) {
checkAnswer(answer);
timer.cancel();
}
}
private void checkAnswer(int answer) {
System.out.println("You said " + answer);
valid = (function.apply(nb1, nb2) == answer) && inTime;
answered = true;
}
int getNb1() { return nb1; }
int getNb2() { return nb2; }
boolean isValid() { return valid; }
public static void main(String[] args) {
List<Calcul> l = Arrays.asList(new Multiplication(), new Multiplication(), new Multiplication());
l.forEach(Calcul::start);
}
}
你试过用close吗,你可以在时间到了的时候检查一下输入是不是“”然后关闭它,可能会有帮助;
if(scanner!=null)
{
scanner.close();
}
您可以检查 System.in.available() > 0
以查看是否有要读取的行。仅当此 return 为真时才调用 sc.nextLine()
以实际接收输入。
一个例子:
Scanner sc = new Scanner(System.in);
long sTime = System.currentTimeMillis();
while (System.currentTimeMillis() - sTime < 5000)
{
if (System.in.available() > 0)
{
System.out.println(sc.nextLine());
}
}
sc.close();
如果有东西要读,这会从控制台读取 5 秒,然后再次打印出来。 注意:实际使用它时,您可能会在循环中抛出一个 sleep
,以免占用太多系统资源。
请注意,这是一个 可行的 解决方案:available()
往往是一种不可靠的方法,它会进行一些估计并且可能会出错。我可能不会在时间关键的系统等中依赖它
还要进一步扩展,此方法依赖于控制台以 大多数 控制台的工作方式(换句话说:我知道的所有控制台):仅当用户输入换行符(例如按回车键)该行实际上交给 System.in
处理。否则,当只输入一个字符时,available()
已经 return 为真。