gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:10:44 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com