5

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

このコードをできるだけシンプルにしようとしました。これは、Listener がシリアル ポートから何らかのデータを受信するのを待っており、メッセージが受信されるとスレッドが何らかの処理を行うというものです。Message の BlockingQueue などの同期変数を使用したいのですが、Listener コードを変更できません。もちろん、問題は実行ループがプロセッサ サイクルを消費することです。私の質問:

実行ループで待機またはスリープしても、関数呼び出しは期待どおりに機能しますか? (これが 100% の確率で機能することをテストする方法がわかりません)。

このループを完全に回避するためのより良い方法はありますか?

4

3 に答える 3

2

このようなことをしてください

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

      }
    }

イベントを取得したら、ステータスを更新/メッセージを保存し、通知スレッドを解放します。次に、スレッドからイベントを処理します

于 2012-06-14T05:36:01.183 に答える
2

あなたが投稿した内容だけを見ると、誰かがスレッドとは何か、どのように機能するかを誤解しているようです。while(true){} 内に実際には何もなく、簡潔にするために切り取っただけではない場合、このスレッドではメッセージの処理は実際には行われません。

メソッドが runnable の実装で定義されているという理由だけで、コードは「スレッド上」で実行されません。

messageReceived(Message m)メソッドが呼び出されると、そのメソッドの本体が呼び出しスレッドで実行されます。このスレッドで定義されているという理由だけで、このスレッドに「渡される」ことはありません。

于 2012-06-14T05:31:58.370 に答える