【问题标题】:Java non-blocking inputJava 非阻塞输入
【发布时间】:2015-12-18 20:59:23
【问题描述】:

我正在编写一个简单的 Java 命令行程序,我需要以非阻塞方式获取用户输入。

典型的阻塞方式是等待用户在连接之前放置一些配置选项,但非阻塞方式是在程序运行时调用类中的方法。

我的程序有一个线程在while循环中运行,如果我输入scanner.nextLine(),循环将被阻塞,直到用户输入内容并按下enter

我想让程序在用户输入数据时正常运行。我想在用户输入uf 460.0 并在程序运行时按enter 时触发一个名为updateFreq(double freq) 的方法。

我不确定这种行为对你是否有意义。

我是否需要创建一个单独的线程来不断监听行输入并将信号发送到主线程或其他什么?

提前谢谢你。

【问题讨论】:

    标签: java command-line user-input


    【解决方案1】:

    创建一个新线程,并实现添加自定义侦听器以将事件传回主线程的功能。

    手绘代码...未经测试,但你明白了:

    class MainThreadClass implements InputListner {
      public MainThreadClass() {
        InputRunner inputRunner = new InputRunner();
        inputRunner.addInputListener(this);
        Thread t = new Thread(new InputThread())
        t.start();
      }
    
      @Override
      public void inputReceived() {
        //bla bla bla
      }
    }
    
    class InputRunner implements Runnable {
      ArrayList<InputListener> listeners = new ArrayList<InputLIsteners>();
    
      public void run() {
        //code to read input, when it is recieved execute fireInputReceived
      }
    
      public void addListener(InputListener listener) {
        listeners.add(listener);
      }
    
      public void fireInputReceived(String input) {
        //loop through all listeners
        //fire inputRecieved on each
      }
    }
    
    public Interface InputListener {
      public void inputReceived(String input);
    }
    

    【讨论】:

    • 抱歉,这么晚才回来。我会尽力让你知道!我正在考虑使用类似的方法,但我不确定使用监听器是否是“工业标准”。 :)
    • 致搜索并最终来到这里的人。不要复制此代码,因为这里有一些语法错误。这个人提供了使用监听器的一般概念。请将此答案与Scanner 类结合起来。我使用while (input.hasNext()) 循环在这个分离的线程中等待用户输入。如果您有任何问题,请发表评论。
    • 有趣的是,在它发布 5 年后,我在这件事上遭到了反对……是的,这段代码是徒手编写的,未经测试(正如我在答案中指出的那样)。这是伪代码,但非常接近,应该让你朝着正确的方向前进。它可以复制,但您必须修复它并填写空白。另外,是的,现在有不同的更好的(有争议的)方法来处理事件,但在 AWT/Swing 的时代,这是一种非常常见的技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2011-01-25
    • 2010-10-01
    • 2011-12-27
    相关资源
    最近更新 更多