Я пишу приложение для BlackBerry, которое взаимодействует с простым периферийным устройством Bluetooth с помощью текстовых AT-команд - аналогично модему ... Я могу заставить его работать на BlackBerry только с помощью прослушивателя событий.Таким образом, связь теперь асинхронная.
Однако, поскольку это простое устройство, и мне нужно управлять одновременным доступом, я бы предпочел просто выполнить блокирующий вызов.
У меня есть следующий кодкоторый пытается преобразовать сообщения в блокировку с помощью ожидания / уведомления.Но когда я его запускаю, notifyResults никогда не запускается до тех пор, пока getStringValue не завершится.то есть он всегда будет зависеть вне зависимости от задержки.
Объект btCon уже работает в отдельном потоке.
Я уверен, что упускаю что-то очевидное с многопоточностью.Может ли кто-нибудь любезно указать на это?
Спасибо
Я должен также добавить всплывающие уведомления notifyAll с исключением IllegalMonitorStateException.
Ранее я пробовал это с простым логическим флагом и циклом ожидания.Но та же проблема существовала.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
}
}
}