java - 非同期リスナーをブロックする方法は?

java blackberry java-me bluetooth iobluetooth

テキストベースのATコマンドを使用してシンプルなBluetooth周辺機器と通信するブラックベリーアプリを書いています-モデムに似ています...イベントリスナーを使用しないと、アプリをブラックベリーで機能させることはできません。したがって、通信は非同期になります。

ただし、これは単純なデバイスであり、同時アクセスを制御する必要があるため、ブロッキングコールを使用することをお勧めします。

待機/通知を使用して通信をブロッキングに変換しようとする次のコードがあります。しかし、それを実行すると、getStringValueが完了するまでnotifyResultsは実行されません。つまり、遅延に関係なく常にタイムアウトします。

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

}
答え
notifyResultsとgetStringValueの両方が同じオブジェクトに同期句を持っているので、getStringValuesが同期セクションに到達すると想定すると、最初にnotifyResultsは同期句の開始時に、getStringValuesが同期領域を出るまでブロックします。私が理解すれば、これはあなたが見ている行動です。

ニコラスの助言はおそらく良いですが、使用しているBlackBerry APIでこれらの実装が見つからない場合があります。 produce-consumerパターンを確認してください。
関連記事

java - Bluetooth通信用の軽量対称鍵アルゴリズム?

java - ユーザーがアイテムを選択することとgetSelectedValue()を区別する方法は?

java - Linux(JDK、Maven、IDEなど)にJava開発環境をインストールする方法VirtualBox

java - JavaアプリによるSMSの暗号化

java - tomcat:OutOfMemoryError:Java heap space-24GB system

java - ローカルファイルのjava.io.InputStreamはいつ閉じられたときに例外をスローしますか?

java - Jruby-Foreman Gemが実行されていない

java - 2つのノード間の二重接続を回避するにはどうすればよいですか?

java - 何かが起こったことを呼び出し側のクラスに通知する

java - GenericNackResponseException