0

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

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

发生的情况是,在读取“你好,输入你的名字”时,你可以输入输入!我仍然需要 Print.slow() 方法来休眠,那么我怎样才能让 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 行。

4

2 回答 2

3

如果想让它同步运行,就在主线程上运行;不要启动另一个线程。

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

编辑

我认为我们有一个术语问题

...在读取“您好,请输入您的姓名”时,您可以输入输入!

我现在将其解释为:

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

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

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

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

于 2012-09-18T17:34:15.670 回答
0

slow(...)如果不了解更多关于您的线程并查看方法,就很难知道发生了什么。

发生的情况是,在读取“你好,输入你的名字”时,你可以输入输入!

但是,这可能是从控制台读取输入的方式的问题。通常控制台输入是缓冲的,因此尽管您还没有nextLine()在主线程中使用该方法,但输入正在被有InputStream问题的记录 - 由系统缓冲。这可能就是您所看到的情况。

如果您看到NAME:提示,则说明发生了其他事情。

于 2012-09-18T17:43:57.543 回答