gpt4 book ai didi

java - 如何要求用户输入控制台(BufferedReader)并显示倒计时?需要在两个线程中完成

转载 作者:行者123 更新时间:2023-12-01 17:39:40 25 4
gpt4 key购买 nike

一旦用户输入数据,计时器就会停止并且 BuferredReader 关闭。如果 10 秒过去并且没有输入 - BuferredReader 关闭并且用户无法进行输入。下面的代码可以工作,但不是 100% 正确。请提出任何解决方案。

public class Main  {

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
NewThread nt = new NewThread(br);
Thread newThread = new Thread(nt);
newThread.start();


System.out.print("Please enter data: ");
System.out.println("");

String value = br.readLine();
System.out.println(value);
nt.shutdown();
}
}

class NewThread implements Runnable {

volatile BufferedReader br;
volatile boolean running ;

public NewThread(BufferedReader br) throws IOException {
this.br = br;
this.running = br.ready();
}
@Override
public void run() {
int count = 10;
try {
while (!running) {
System.out.print("("+count +")"+ '\r');
Thread.sleep(1000);
count--;
if (count <0){
shutdown();
}
}
} catch (InterruptedException | IOException e) {
e.printStackTrace();
}
}
public void shutdown () throws IOException {
running=true;
br.close();
}

}

最佳答案

所以,首先你调用方法:

br.readLine()

此方法的 BufferedReader 实现在等待用户输入时使用同步块(synchronized block)。下面我贴出这个方法的部分代码:

String readLine(boolean ignoreLF) throws IOException {
StringBuffer s = null;
int startChar;

synchronized (lock) {
ensureOpen();
...}

接下来,当您从阅读器上的 NewThread(超时后)调用关闭方法时,该方法会调用缓冲区上的 close 方法 - 此方法的执行也使用同步机制:

public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close();
} finally {
in = null;
cb = null;
}
}
}

所以这意味着 close 方法将在 readLine 方法完成后执行(恰好在 readLine 方法中执行同步块(synchronized block)之后),当您将参数传递到控制台时完成。我认为当您使用 System.in 时,通过标准 java 机制调用 readLine 方法后不可能关闭此阅读器。

关于java - 如何要求用户输入控制台(BufferedReader)并显示倒计时?需要在两个线程中完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60978138/

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