Java 非阻塞输入
Java non-blocking input
我正在编写一个简单的 Java 命令行程序,我需要以非阻塞方式获取用户输入。
典型的阻塞方式是等待用户在连接之前放置一些配置选项,但非阻塞方式是在程序 运行ning 时调用 class 中的方法。
我的程序在 while
循环中有一个线程 运行ning,如果我输入 scanner.nextLine()
,循环将被阻塞,直到用户输入某些内容并按下 enter
.
我想让程序运行在用户输入数据时正常运行。我想在用户输入 uf 460.0
时触发一个名为 updateFreq(double freq)
的方法并在程序为 运行ning 时按 enter
。
我不确定这种行为对你是否有意义。
我是否需要创建一个单独的线程来不断地监听线路输入并将信号发送到主线程或其他东西?
提前致谢。
创建一个新线程,并实现添加自定义侦听器以将事件传回主线程的功能。
手绘代码...未经测试但您明白了:
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);
}
我正在编写一个简单的 Java 命令行程序,我需要以非阻塞方式获取用户输入。
典型的阻塞方式是等待用户在连接之前放置一些配置选项,但非阻塞方式是在程序 运行ning 时调用 class 中的方法。
我的程序在 while
循环中有一个线程 运行ning,如果我输入 scanner.nextLine()
,循环将被阻塞,直到用户输入某些内容并按下 enter
.
我想让程序运行在用户输入数据时正常运行。我想在用户输入 uf 460.0
时触发一个名为 updateFreq(double freq)
的方法并在程序为 运行ning 时按 enter
。
我不确定这种行为对你是否有意义。
我是否需要创建一个单独的线程来不断地监听线路输入并将信号发送到主线程或其他东西?
提前致谢。
创建一个新线程,并实现添加自定义侦听器以将事件传回主线程的功能。
手绘代码...未经测试但您明白了:
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);
}