gpt4 book ai didi

java - 终端中的数据循环打印可由用户输入终止

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

我的任务是在终端打印货币汇率表,每分钟延迟打印一次。在用户输入时,我将结束循环并返回到海关终端菜单。如何实现?

总的来说,我很难弄清楚如何获得无缝的用户体验。如果没有用户操作,我需要在终端中输入用户并每分钟打印一次数据。最终,如果用户决定终止打印,如何终止整个数据打印循环? -> runFlag = ????;

这真的是正确的做法吗?

我尝试了几种方法,不幸的是没有一种方法有效。

有人能帮帮我吗?

到目前为止,我只有以下代码。在循环中打印汇率的自定义方法:

private void printExchangeRateTable(final Map<String, Integer> storedExchangeRates){

boolean runFlag = true;
do {

printExchangeRates(storedExchangeRates);

println("Hit any key to stop loop");

Thread threadDelayer = new Thread(new Delayer());
Thread threadListeningUserInput = new Thread(new UserInputListener());

threadDelayer.start();
threadListeningUserInput.start();

runFlag = ????;

} while (runFlag);
}

延迟对象

final class Delayer implements Runnable {

public static final long MILISECONDS = 1000L;

@Override
public void run(){
try {
Thread.sleep(60 * MILISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

用户输入监听器

class UserInputListener implements Runnable {

@Override
public void run() {
Scanner scanner = new Scanner(System.in);
val userInput = scanner.nextLine();
if(userInput != null) {
Thread.currentThread().interrupt();
}
}
}

最佳答案

您可以使用 ScheduledExecutorService 设置重复任务,但是在这里,将用户输入的读取发送到后台任务要容易得多

public static void main(String[] args) {
Scanner s = new Scanner(System.in);
CompletableFuture<String> userInput = CompletableFuture.supplyAsync(s::nextLine);
while(!userInput.isDone()) {
printData();
try {
userInput.get(1, TimeUnit.MINUTES);
}
catch(ExecutionException|InterruptedException ex) {} // handled after the loop
catch(TimeoutException ex) {
continue;
}
}
String input = userInput.join();
// handle input
}

private static void printData() {
System.out.println("data");
}

CompletableFuture.supplyAsync(s::nextLine) 会将 s.nextLine() 的执行提交给后台任务。然后,循环将运行直到后台任务完成,每分钟执行一次 printData()。这是通过 userInput.get(1, TimeUnit.MINUTES) 实现的,如果在指定时间后没有可用结果,它将抛出 TimeoutExceptioncontinue 在这里不是必需的,因为无论如何循环都会继续,但我明确表示了。

其他可能的异常是在本质上处理的。中断不应该发生,但通过进入下一次迭代,它可以用作甚至在时间之前刷新打印数据的信号。当发生ExecutionException时,无论如何在循环后的join()语句中获取到实际用户输入时都会报错状态。

这个循环也可以合并到一个更大的循环中

Scanner s = new Scanner(System.in);
for(boolean quit = false; !quit; ) {
CompletableFuture<String> userInput = CompletableFuture.supplyAsync(s::nextLine);
while(!userInput.isDone()) {
printData();
try {
userInput.get(1, TimeUnit.MINUTES);
}
catch(ExecutionException|InterruptedException ex) {} // handled implicitly
catch(TimeoutException ex) {
continue;
}
}
String input = userInput.join();
// handle input
if(input.equals("exit")) quit = true;
}

关于java - 终端中的数据循环打印可由用户输入终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57185785/

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