gpt4 book ai didi

Java - 暂停线程以进行输入

转载 作者:行者123 更新时间:2023-12-02 00:12:26 24 4
gpt4 key购买 nike

我在运行线程时遇到问题。看,我想要一个纯粹用于缓慢打印一段文本的类,即在每个字母之间等待 x 毫秒(将其视为 Pokémon 中文本显示的方式!)。所以目前,我有一个 Main 类和一个静态的“Print”类。 Print类中有一个名为slow的静态方法。您传入一个字符串和每个字母之间的延迟。问题是,如果在我的主课中我说

Print.slow("Hello there, enter your name");
System.out.println("NAME:");
name = (scanner object).nextLine();

发生的情况是,当正在读取“您好,请输入您的名字”时,您可以输入内容!我仍然需要 Print.slow() 方法来 hibernate ,那么如何让 main 方法暂停,直到读完该段落?

printSlow 方法(Print 类被重构为 main 中的方法)

public static void printSlow(String passage, int delay)
{
int normDelay = delay;
char lastChar = 'a';
for(int i=0; i<passage.length(); i++)
{
try {
if(passage.charAt(i) == '.' && passage.charAt(i + 1) == '.') {
System.out.print(".");
try {
Thread.sleep(normDelay*10);
} catch (InterruptedException e) {
e.printStackTrace();
}
continue;
}
} catch (Exception e) {
System.out.print(".");
try {
Thread.sleep(normDelay*10);
}catch(InterruptedException e1) {
e1.printStackTrace();
}
continue;
}
if(passage.charAt(i) == ' ' && (lastChar == ',' || lastChar == '.' || lastChar == '!' || lastChar == '?'))
{
continue;
}else
{
System.out.print(passage.charAt(i));
}

if(passage.substring(i, i + 1).equals(".")
|| passage.substring(i, i + 1).equals(",")
|| passage.substring(i, i + 1).equals("!")
|| passage.substring(i, i + 1).equals("?"))
{
System.out.println();
delay = normDelay * 10;
}
try
{
Thread.sleep(delay);
delay = normDelay;
}
catch(InterruptedException e)
{
System.out.println(e);
}
lastChar = passage.charAt(i);
}
}

之所以如此复杂,是因为我在每个句号、逗号等之后都需要更长的延迟,而且连续三个句号也不会最终跳过 3 行。

最佳答案

如果希望同步运行,就在主线程运行;不要启动另一个线程。

如果您必须启动另一个线程,请在调用 Print.slow() 之后在主线程中使用 Thread#join()Print 类需要提供一个 getThread() 方法,以便主线程可以访问打印线程。

编辑

我认为我们遇到术语问题

...while "Hello there, enter your name" is being read, you can enter input!

我现在将其解释为:

  1. 字符串 Hello there... 正在缓慢显示
  2. 在此显示期间,用户可以键入与输出交错的字符。

如果这就是您的意思,那么您的整个方法就是错误的。您正在使用输入和输出流,这些流最终由 shell 管理并连接到您的进程。操作系统/shell 正在缓冲输入,您无法控制。

如果您真正想要的是防止在输出发生时识别任何击键,那么这是一个更加困难的问题,并且需要特定于操作系统(即不可移植) 。您需要直接从输入设备读取并自己处理每个击键,这使用输入/输出流几乎是不可能的。

您可以通过为 UI 编写 Swing 应用程序来获得这种级别的控制,这将允许您拦截每个事件并执行您想要的任何操作。作为一个普通的命令行程序,您不太可能实现您想要的目标。

关于Java - 暂停线程以进行输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12482081/

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