2

Java プログラムを実行し続けながら、いつでも入力できるようにする方法を考えていました。

現在、バッファリーダーを使用して行を読み取っていますが、プログラムが停止して入力を待機します。プログラムを実行し続けたいが、必要なときにいつでも入力できるようにしたいのですが、これを行う方法はありますか?

4

5 に答える 5

9

これを希望どおりに機能させるには、アプリケーションのマルチスレッド化を検討する必要があると思います。

編集: もちろん、この機能は純粋な CLI インターフェースで実現できますが、完全な応答/イベント駆動型システムをマルチスレッドで実行したい場合は、おそらく他のオプション (つまり、GUI オプション) を検討する方がよいでしょう。

于 2009-05-14T15:35:03.987 に答える
2

マルチスレッド コマンド ライン インターフェイス アプリケーションがどのように機能するかを示す簡単な例を次に示します。これには、コンソールでユーザーからの入力を待っている間にバックグラウンドでタスクを実行するために、入力のポーリングや GUI インターフェイスは必要ありません。

この例では、Threadがバックグラウンドで実行されており、指定された秒数後にグリーティングを出力するように指示できます。

public class CommandLineMultiThread
{
    public static void main(String[] args)
    {
        Scanner s = new Scanner(System.in);

        // Makes and runs the background thread.
        MyThread myThread = new MyThread();
        Thread t = new Thread(myThread);
        t.start();

        // Get the number of seconds to wait from the console.
        // Exit when "0" is entered.
        int waitDuration;
        do
        {
            waitDuration = s.nextInt();
            myThread.setGreetIn(waitDuration);

        } while (waitDuration != 0);

        myThread.quit();
    }

    static class MyThread implements Runnable
    {
        boolean running = true;                // Boolean to keep thread alive.
        long greetingTime = Long.MAX_VALUE;    // Time to greet at.

        public void setGreetIn(int i)
        {
            greetingTime = System.currentTimeMillis() + (i * 1000);
        }

        public void quit()
        {
            running = false;
        }

        public void run()
        {
            while (running)
            {
                if (System.currentTimeMillis() > greetingTime)
                {
                    System.out.println("Hello!");
                    greetingTime = Long.MAX_VALUE;
                }

                try
                {
                    Thread.sleep(100);
                }
                catch (InterruptedException e) {}
            }
        }
    }
}

このScannerクラスを使用して、オブジェクトからの入力をルーティングすることにより、コマンド ライン インターフェイスからのユーザー入力を受け入れることができSystem.inます。

次に、バックグラウンド スレッドが実行されている間、メイン スレッドはメソッドからmyThreadの入力を待機します。待機秒数が受け入れられると、バックグラウンド スレッドは特定の時間まで待機するように指示され、その時間になると、グリーティングがコンソールに出力されます。System.inScanner.nextIntHello!

于 2009-05-14T16:04:56.367 に答える
1

あなたのプログラムは時々ユーザー入力をポーリングする必要があると思います。

于 2009-05-14T15:35:18.073 に答える
1

CLI の代わりに素敵なマルチスレッド GUI を与えてください :)

于 2009-05-14T15:38:47.067 に答える
0

私はジェームズに同意します。別の選択肢は、「偽の」連続プログラムの実行です。これはすべてのシナリオで機能するわけではありませんが、ユーザー入力を表示する直前にタイマーを設定し、ユーザーが何かを入力したときに停止してから「開始」するまでの時間を計算できます。

その時間を使用して、繰り返し機能を特定の回数実行します。これは、数秒ごとに整数を絶えず排出するなど、タイマー自体にすでに何かがある場合にのみ役立ちます。

例:

あなたはユーザーに質問をしますが、答えるのに5秒しか与えたくありません。ユーザーが応答する(Enterキーを押す)と、プログラムはユーザーが入力するのにかかった時間を計算します。長すぎる場合は1つのメッセージをスローし、制限時間内に別のメッセージをスローします。

私が提案しているのは、この方法を提案しているだけです。なぜなら、あなたが本当にやりたいことであるスレッド化は非常に高度だからです。

于 2009-05-14T15:46:50.887 に答える