gpt4 book ai didi

java - 取消用户输入

转载 作者:行者123 更新时间:2023-12-01 18:01:11 26 4
gpt4 key购买 nike

假设我有一段 java 代码:

Scanner s = new Scanner(System.in);

Long time = System.nanoTime() + 10000000000L; //10 seconds in the future
String input = s.nextLine();
//What to do from here?

System.out.println("Timed out");

如果用户尚未输入任何内容并且当前时间大于时间,我如何取消用户输入?有什么方法可以让用户在输入内容的同时运行代码吗? nextLine() 似乎会暂停执行,直到用户输入某些内容。

最佳答案

许多“阻塞直到发生某些事情”方法(例如 java.lang.Thread 的 wait 方法)都有一个重载变体,您可以在其中指定超时。但是,大多数 I/O 方法(例如扫描仪的 nextLine 或 inputstream 的 read)都不会。

这些类型的规范表明它们是否可中断是有意未定义的; java 希望在尽可能多的平台上运行,最低的共同点是“不可中断”,这就是为什么它如此指定。

但是,在大多数平台上,是的,您可以中断它。

因此,解决方案:

启动第二个线程,将您的线程的引用传递给它,并告诉它在经过一定时间后中断该线程。

被中断的线程只是“引发中断标志”,仅此而已(如果您愿意,您可以使用 if (Thread.interrupted()) ...; 检查,这也会清除此然而,如果您在该标志被提升时调用它们,java 中内置的各种方法将立即退出,并且如果您在它们阻塞时提升该标志,它们将就地中止。

任何声明为抛出 InterruptedException 的方法(例如 Thread.sleep),都保证具有此行为。任何其他阻塞方法可能会也可能不会(回到整个“Java 运行的所有平台的共同点”)。换句话说,由于您不太知道代码将在哪里,因此您需要处理各种场景。如果中断发生在您等待输入时怎么办(最有可能的是,readLine 通过抛出您可以捕获的内容而结束),如果它发生在之后(该标志将上升;您需要在某个时候清除它)怎么办),以及如何“取消取消”——如果用户确实键入,您希望那个滴答作响的定时炸弹线程自行结束。您可以通过设置定时炸弹线程检查的变量来做到这一点,即使它只在时间到了后检查它(时间到了!哦,我应该中断的线程在我等待超时时告诉我不再需要它,所以我现在就结束)。

一切都相当复杂。可能有一些库可以让您的操作变得更加简单,但我个人并不知道有哪个库。


public class InterruptMeThread extends Thread {
private final Thread interruptMe;
private final long millis;
private volatile boolean nevermind;

public InterruptMeThread(Thread interruptMe, long millis) {
this.interruptMe = interruptMe;
this.millis = millis;
}

@Override public void run() {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
// Who interrupts the interruptors? Let's assume this means
// My interruption services are no longer desired and exit.
return;
}

if (!nevermind) interruptMe.interrupt();
}

public void nevermind() {
this.nevermind = true;
Thread.interrupted(); // clear the flag if it is raised.
}
}

使用中:


InterruptMeThread imt = new InterruptMeThread(Thread.currentThread(), 10000);
imt.start();
try {
reader.nextLine();
} catch (IOException e) {
// You'd have to test what kind of exception falls out of interrupted...
// But something will
// For now, to debug it so we can see it...
throw new RuntimeException(e); // or just let it bubble up, either way works.
}
imt.nevermind();

关于java - 取消用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60622729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com