我试图弄清楚如何消除Java中线程的繁忙循环。线程除了等待Listener类的回调外不执行任何操作。线程类看起来像这样:

class MyThread implements Runnable, MessageListener{
  private Listen Listener;

  public MyThread(){
    Listener = new Listener(this);
  }

  public void run(){
    while(true){}
  }

  public void messageReceived(Message m){
    //do stuff
  }
}

我试图使此代码尽可能简单。这个想法是,监听器正在等待从串行端口接收一些数据,并且当接收到消息时,线程将对其进行一些处理。我希望使用一些同步变量,例如Message的BlockingQueue,但是我无法修改Listener代码。当然,问题在于运行循环消耗了处理器周期。我的问题:

如果我在运行循环中等待或 sleep ,函数调用是否仍可以按预期运行? (我不确定如何100%地测试它是否有效)。

有什么更好的方法可以完全避免这种循环吗?

最佳答案

做这样的事情

class MyThread implements Runnable, MessageListener{
          private Listen Listener;
          private Object lock = new Object();
      public MyThread(){
        Listener = new Listener(this);
      }

      public void run(){
        while(true){
            synchronized (lock) {
                try{
                    lock.wait();
                    // use the updated status
                }catch (Exception e) {
                    e.printStackTrace()
                }
            }
        }
      }

      public void messageReceived(Message m){
          synchronized (lock) {
                try{
                    // Do something with the message here like update some status
                    lock.notify();
                }catch (Exception e) {
                    e.printStackTrace()
                }

      }
    }

收到事件后,您将更新某些状态/存储消息并释放通知线程。然后从您的线程处理事件

09-10 08:41
查看更多