我正在编写一个黑莓应用程序,它使用基于文本的 AT 命令与简单的蓝牙外围设备进行通信——类似于调制解调器......我只能使用事件侦听器让它在黑莓上工作。所以通信现在是异步的。
但是,由于它是一个简单的设备并且我需要控制并发访问,我宁愿只进行阻塞调用。
我有以下代码尝试通过使用等待/通知将通信转换为阻塞。但是当我运行它时, notifyResults 在 getStringValue 完成之前永远不会运行。即,无论延迟如何,它总是会超时。
btCon 对象已经在单独的线程上运行。
我确定我在线程方面遗漏了一些明显的东西。有人可以指出吗?
谢谢
我还应该添加带有 IllegalMonitorStateException 的 notifyAll。
我之前用一个简单的布尔标志和一个等待循环尝试过。但同样的问题也存在。notifyResult 在 getStringValue 完成之前永远不会运行。
public class BTCommand implements ResultListener{
String cmd;
private BluetoothClient btCon;
private String result;
public BTCommand (String cmd){
this.cmd=cmd;
btCon = BluetoothClient.getInstance();
btCon.addListener(this);
System.out.println("[BTCL] BTCommand init");
}
public String getStringValue(){
result = "TIMEOUT";
btCon.sendCommand(cmd);
System.out.println("[BTCL] BTCommand getStringValue sent and waiting");
synchronized (result){
try {
result.wait(5000);
} catch (InterruptedException e) {
System.out.println("[BTCL] BTCommand getStringValue interrupted");
}
}//sync
System.out.println("[BTCL] BTCommand getStringValue result="+result);
return result;
}
public void notifyResults(String cmd) {
if(cmd.equalsIgnoreCase(this.cmd)){
synchronized(result){
result = btCon.getHash(cmd);
System.out.println("[BTCL] BTCommand resultReady: "+cmd+"="+result);
result.notifyAll();
}//sync
}
}
}