java - 如何使用回调函数避免 Java 线程中的忙循环

标签 java multithreading callback

我正在尝试找出如何消除 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
  }
}

我已尝试使此代码尽可能简单。这个想法是 Listener 正在等待从串口接收一些数据,当收到消息时,线程将对其进行一些处理。我更愿意使用一些同步变量,例如 Message 的 BlockingQueue,但我无法修改 Listener 代码。当然,问题是运行循环会占用处理器周期。我的问题:

如果我在运行循环中等待或 hibernate ,函数调用是否仍会按预期工作? (我不确定如何测试这是否在 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()
                }

      }
    }

一旦你得到事件,你更新一些状态/存储消息并释放通知线程。然后从你的线程处理事件

关于java - 如何使用回调函数避免 Java 线程中的忙循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11027129/

相关文章:

java - java源码中的Maven groupId和包名

java - jackson 注释根据另一个字段决定一个字段类

multithreading - Clojurescript中如何实现Atom?

java - 单独类中的线程如何将数据传递给主类

java - java中的回调是什么?

java - 是否有一个函数可以去除 HTTP 响应头?

java - 如何在 Android 中使用计时器?

android - 按钮、OpenGL 和渲染器 - Android

java - Android Canvas 线程变得疯狂

Javascript 回调函数没有被调用