我正在尝试从JTextField中读取System.in InputStream。
我需要它做的是,一旦用户在JTextField中按Enter键,允许.read()
继续进行。
问题是我不知道什么时候会调用.read(),我希望它在不冻结主线程的情况下阻塞,直到用户在JTextField中按下enter键,它将通知线程等待
到目前为止,我尝试了以下内容:
public class InputStreamHandlerThread extends Thread {
private JTextField txt;
public InputStreamHandlerThread(JTextField txt) {
this.txt = txt;
start();
}
@Override
public void run() {
System.setIn(new FakeInputStream());
}
class FakeInputStream extends InputStream {
private int indx = 0;
@Override
public int read() throws IOException {
if (indx == txt.getText().length()) {
indx = 0;
try {
synchronized (this) {
wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int byt = txt.getText().getBytes()[indx];
indx++;
return byt;
}
}
}
由GUI线程初始化并启动。 因此,一旦GUI加载,它就会创建一个这个类的实例并保留一个指针,这样当在JTextField中的键盘上按下回车键时,它会被通知从它读取。
in = new JTextField();
in.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent a) {
if (a.getKeyChar() == '\n') {
inputStreamHandler.notify();
}
}
});
所以目前有三个主题:
1. GUI上运行的主要线程
2. InputStream处理程序线程(见上文^)
3.从System.in
问题是,一旦我调用inputStreamHandler.notify();
,它会抛出一个java.lang.IllegalMonitorStateException
,根据文档,如果该线程不是锁的持有者,则抛出该$ sudo -u hdfs hadoop dfsadmin -report
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
。
我该如何解决这个问题?
谢谢:-)
答案 0 :(得分:0)
String text;
...
in.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
text = in.getText();
}
});
确保在两个字段中创建文字。