我正在编写一个黑莓应用程序,该应用程序使用基于文本的AT命令与简单的蓝牙外围设备进行通信-类似于调制解调器...我只能使用事件侦听器在黑莓上运行它。因此,通信现在是异步的。

但是,由于它是一个简单的设备,并且我需要控制并发访问,所以我希望仅进行阻塞调用。

我有以下代码尝试通过使用等待/通知将通信转换为阻塞。但是,当我运行它时,notifyResults永远不会运行,直到getStringValue完成。也就是说,无论延迟如何,它始终会超时。

btCon对象已经在单独的线程上运行。

我确定我在线程方面缺少明显的东西。有人可以指出吗?

谢谢

我还应添加带有IllegalMonitorStateException的notifyAll爆炸。

我以前用一个简单的布尔标志和一个等待循环来尝试过。但是存在同样的问题。在getStringValue完成之前,notifyResult永远不会运行。

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
        }
    }

}

最佳答案

由于notifyResults和getStringValue在同一个对象上都具有同步子句,因此假设getStringValues到达同步部分,则首先notifyResults将在同步子句的开始处阻塞,直到getStringValues退出同步区域。据我了解,这就是您所看到的行为。

Nicholas的建议可能很好,但是您可能在所使用的BlackBerry API中找不到任何这些实现​​。您可能想看看produce-consumer模式。

关于java - 如何使异步监听器做阻塞?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8975701/

10-12 05:53