Java 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循环内的串行端口读取数据,如下所示:

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线程上长时间运行的进程造成了问题。