Java While循环问题
我正在从while循环内的串行端口读取数据,如下所示:Java While循环问题,java,core,Java,Core,我正在从while循环内的串行端口读取数据,如下所示: while((len = this.getIn().read(buffer)) > 0) { data = new String(buffer, 0, len); System.out.println("data len " + len); handleModemresponse(data); } 但是,当从流开始读取数据时,带有断开按钮的主AWT窗口没有获取任何侦听器(整个窗口没有获取侦听器)。它仅在传输完
while((len = this.getIn().read(buffer)) > 0) {
data = new String(buffer, 0, len);
System.out.println("data len " + len);
handleModemresponse(data);
}
但是,当从流开始读取数据时,带有断开按钮的主AWT窗口没有获取任何侦听器(整个窗口没有获取侦听器)。它仅在传输完成时侦听,即在while循环之外
我希望我的AWT窗口在while循环中也能监听我的操作
有什么办法可以实现吗?我想你应该把这个while循环推到一个单独的线程中,这样在传输过程中就不会绑住你的AWT线程。我想你应该把这个while循环推到一个单独的线程中,这样在传输过程中就不会绑住你的AWT线程。看起来你什么都准备好了一个线程-因此,当您的工作方法正在进行时,您的GUI似乎被阻塞,并且在循环结束之前不会响应任何操作
您必须在一个线程中分离您的GUI参与,在另一个线程中分离您的工作方法。看起来您在一个线程中拥有所有内容-因此,当您的工作方法正在进行时,您的GUI似乎被阻止,并且在循环结束之前不会响应任何操作
您必须在一个线程中分离GUI参与,在另一个线程中分离工作方法。您正在调用的读取方法是阻塞的。您需要将其移动到另一个线程中,以便侦听器继续工作。您正在调用的读取方法正在阻塞。您需要将其移动到另一个线程中,以便侦听器继续工作。为读取操作创建一个新线程
public class LongProcess implements Runnable {
public void startProcess() {
Thread t = new Thread(this);
t.start();
}
public void run() {
// Define inputstream here
while((len = inputStream.read(buffer)) > 0) {
data = new String(buffer, 0, len);
System.out.println("data len " + len);
handleModemresponse(data);
}
}
}
编辑(在汤姆·霍丁的评论之后-tackline):
为读取操作创建一个新线程
public class LongProcess implements Runnable {
public void startProcess() {
Thread t = new Thread(this);
t.start();
}
public void run() {
// Define inputstream here
while((len = inputStream.read(buffer)) > 0) {
data = new String(buffer, 0, len);
System.out.println("data len " + len);
handleModemresponse(data);
}
}
}
编辑(在汤姆·霍丁的评论之后-tackline):
@帕克斯:很抱歉格式化删除了您的格式;)您在重新表述此问题方面做得更好。没问题,@VonC,这种情况经常发生,主要是因为一旦开始编辑,我会保留问题的外观,而且我花的时间太长。@Pax:很抱歉,格式设置删除了您的格式设置;)你在重新表述这个问题上做得更好。没问题,@VonC,这种情况经常发生,主要是因为一旦我开始编辑这个问题,我会一直坚持让它看起来很好,我花了太长的时间.java.awt.EventQueue.invokeLater才能回到awt EDT线程中。呃…invokeLater用于在找到线程时通知gui:finally in run()执行类似于。。。ies.invokeLater(new Runnable(){…public void run(){gui.taskistone(result);…java.awt.EventQueue.invokeLater返回awt EDT线程。呃…invokeLater用于在找到线程时通知gui:最后在run()中执行类似于…ies.invokeLater(new Runnable(){…public void run()){gui.taskistone(result);…..更准确地说,阻塞I/O不是这里的问题。是gui线程上长时间运行的进程造成了问题。更准确地说,阻塞I/O不是这里的问题。是gui线程上长时间运行的进程造成了问题。