3

そのため、コンソールアプリケーションのメインスレッドで無限ループが実行されています。

public static void main(String[] args) {
    while(true){
        doSomething();
        doSomethingElse();
        System.out.println("some debugging info");
        doAnotherThing();
    }
}

このコードを何度も何度も実行したいです。

ときどき、「give me more info plox」という文字列などのコマンドをコンソールに入力し、そのコマンドが何かに等しい場合、コードに何かを実行させたいと思います。

通常はスキャナーを使用するだけですが、ここではそれができません。コードを一時停止します... コマンドを入力するかどうかに関係なく、コードを実行し続けたいです。私が確認できる唯一の回避策は、ファイルを使用することです。しかし、他に選択肢はありますか?

4

3 に答える 3

3

あなたは以下のようなことをするかもしれません

public class MainApp implements Runnable
{

    static String command;
    static boolean newCommand = false;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        MainApp reader = new MainApp();
        Thread t = new Thread(reader);
        t.start();

        while (true)
        {
            doSomething();

            if (newCommand)
            {
                System.out.println("command: " + command);
                newCommand = false;
                //compare command here and do something
            }
        }
    }

    private static void doSomething()
    {
        try
        {
            System.out.println("going to do some work");
            Thread.sleep(2000);
        } catch (InterruptedException ex)
        {
            Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run()
    {
        Scanner scanner = new Scanner(System.in);

        while(true)
        {
            command = scanner.nextLine();
            System.out.println("Input: " + command);
            newCommand= true;
        }
    }



}
于 2013-06-26T23:55:09.387 に答える
0

あなたは試すことができますSystem.in.available()、それはノンブロッキングです。ただし、この方法は十分に仕様化されていないことが知られています。一部のシステム (Unix ベースの OpenJDK) では> 0、ユーザーがenterキーで入力を確認した後にのみ返されます。

System.in.read()それ以外の場合は、別のスレッドで継続的にブロックするというモルガノの提案。

于 2013-06-26T23:52:09.987 に答える