我试图弄清楚如何消除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()
}
}
}
收到事件后,您将更新某些状态/存储消息并释放通知线程。然后从您的线程处理事件