0

スレッドの実行に問題があります。ほら、私は純粋にテキストの一節をゆっくりと印刷するためのクラスを持ちたい、つまり各文字の間にxミリ秒待つ(ポケモンでのテキストの表示方法と考えてください!)。そのため、現時点では、Mainクラスと、静的な「Print」クラスがあります。Printクラスには、slowと呼ばれる静的メソッドがあります。文字列と各文字間の遅延を渡します。問題は、私のメインクラスで私が言うなら

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

「こんにちは、名前を入力してください」を読んでいる間に、入力を入力できます。まだPrint.slow()メソッドをスリープ状態にする必要があるので、パッセージが読み取られるまでメインメソッドを一時停止するにはどうすればよいですか?

printSlowメソッド(Printクラスはメインのメソッドにリフラクタされました)

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つの終止符が連続していても3行スキップされないためです。

4

2 に答える 2

3

同期的に実行する場合は、メインスレッドで実行します。別のスレッドを開始しないでください。

別のスレッドを開始する必要がある場合は、Thread#join()を呼び出した直後にメインスレッドで使用しますPrint.slow()。クラスは、メインスレッドが印刷スレッドにアクセスできるようにメソッドPrintを提供する必要があります。getThread()

編集

用語の問題があると思います

...「こんにちは、あなたの名前を入力してください」を読んでいる間、あなたは入力を入力することができます!

私は今これを次のことを意味すると解釈します:

  1. 文字列Hellothere...がゆっくり表示されています
  2. この表示中に、ユーザーは出力とインターリーブされる文字を入力できます。

それがあなたの言いたいことなら、あなたのアプローチ全体は正しくありません。最終的にシェルによって管理され、プロセスに接続されている入力ストリームと出力ストリームを使用しています。OS /シェルは入力をバッファリングしており、ユーザーは制御できません。

出力が発生しているときにキーストロークが認識されないようにすることが本当に必要な場合、これははるかに難しい問題であり、OS固有(つまり、ポータブルではない)である必要があります。入力デバイスから直接読み取り、各キーストロークを自分で処理する必要があります。これは、入出力ストリームを使用することはほとんど不可能です。

UI用のSwingアプリを作成して、このレベルの制御を取得できます。これにより、すべてのイベントをインターセプトして、必要なことを実行できます。単純なコマンドラインプログラムとして、目的を達成できる可能性はほとんどありません。

于 2012-09-18T17:34:15.670 に答える
0

スレッドについて詳しく知り、slow(...)メソッドを見ずに、何が起こっているのかを知ることは困難です。

なんと、「こんにちは、名前を入力してください」と読み上げられている間に、入力できるようになります!

ただし、これはコンソールから入力を読み取る方法に問題がある可能性があります。多くの場合、コンソール入力はバッファリングされるため、nextLine()メイン スレッドのメソッドに到達していなくても、入力はInputStream問題のシステムによって記録され、システムによってバッファリングされます。これは、あなたが見ている状況かもしれません。

プロンプトが表示されている場合はNAME:、何か他のことが起こっています。

于 2012-09-18T17:43:57.543 に答える