2017-06-12 5 views
0

私はHandlerThreadのソースコードを使用していますが、HandlerThreadのrun()メソッドの一部が同期されている理由を理解できません。HandlerThreadのrun()メソッドの一部が同期されているのはなぜですか?

@Override 
public void run() { 
    mTid = Process.myTid(); 
    Looper.prepare(); 
    synchronized (this) { 
     mLooper = Looper.myLooper(); 
     notifyAll(); 
    } 
    Process.setThreadPriority(mPriority); 
    onLooperPrepared(); 
    Looper.loop(); 
    mTid = -1; 
} 

私はrun()方法は、それはので、どのようにそれが複数のスレッドから到達することができ属するスレッドで呼び出されていると考え?

私は、誰かが同じHandlerThreadクラスの複数のインスタンスを作成して起動すると、状況に関係なく動作することを期待しています。

+0

多分、他のスレッドはその 'Thread'インスタンスをロックしていますか? (これは一般的に悪い考えです) – SLaks

+0

これは、そのクラスの他の部分と同じように "//スレッドが開始されていれば、ルーパーが作成されるまで待ってください。 synchronized(this){" –

+0

これはちょうど推測です(アンドロイドは分かりません)が、 'handleThread.wait();'を呼び出すと、 'mLooper'の値が変わるのを待っているようです。 –

答えて

0

notifyAllを呼び出すために同期が必要な理由があります。

JavaDocを参照してください:

この方法だけ このオブジェクトのモニターを所有するスレッドによって呼び出されなければなりません。そのオブジェクトの同期インスタンスメソッドを実行することにより

  • :スレッドは、3つの方法のいずれかでオブジェクトの モニタの所有者になります。

  • オブジェクトを同期させる同期文の本体を実行することにより、

  • クラス型のオブジェクトの場合、そのクラスの同期静的メソッドを実行します。

一度に1つのスレッドだけがオブジェクトのモニタを所有できます。

0

notifyAll()の呼び出し側は、オブジェクトのロックを保持しなければならないので、その文が​​ブロックである理由です。 mLooperの割り当ては、書き込みが他のスレッドに可視であることを保証するために同期され、このコードが含まHandlerThread#getLooper()の具体呼び出し元(S):

0
// If the thread has been started, wait until the looper has been created. 
    synchronized (this) { 
     while (isAlive() && mLooper == null) { 
      try { 
       wait(); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 

getLooper()方法はに接続Looperインスタンスを返すことになっていますHandlerThread。また、このゲッターは明らかな理由からスレッドセーフでなければなりません。そのため、実装を無期限に待機し、メソッドはmLooperがセットアップされた後にすべての待機中のスレッドに通知します。

public void run() { 
    ... 
    synchronized (this) { 
     mLooper = Looper.myLooper(); 
     notifyAll(); 
    } 
    ... 
} 

public Looper getLooper() { 
    ... 
    synchronized (this) { 
     while (isAlive() && mLooper == null) { 
      try { 
       wait(); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 
    return mLooper; 
} 

同期ブロックは、wait()方法が中断固有ロックを要求するコードの最小の部分です。

関連する問題