3

所以我有一个无限循环在我的控制台应用程序的主线程中运行,就像这样。

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

我希望这段代码一遍又一遍地运行。

偶尔,我想在控制台中输入一个命令,例如字符串“给我更多信息 plox”,然后如果该命令等于某事,我希望我的代码做某事。

通常我只会使用扫描仪,但我不能在这里这样做 - 因为scanner.next(); 暂停我的代码...无论我是否输入命令,我都希望我的代码继续运行。我能看到的唯一解决方法是使用文件。但是还有其他选择吗?

4

3 回答 3

3

使用线程,一个主线程从控制台读取,另一个线程执行循环,第一个线程更新字符串列表(生产者),循环线程读取列表以查看是否有新内容(消费者)

于 2013-06-26T23:38:47.120 回答
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 回答