Java Exchanger交換スレッド

1374 ワード

Exchangerは1つのpipelineを使用して2つのスレッドのデータを交換し、交換中にSlotがロックされ、一般的に通信分野で使用されます.このクラスには2つの方法があります
//k交換対象exchange(V k)//タイムアウト時間exchange(V k,int timeOut,TimeUnit unit)を指定
使用する場合、パラメータkが必須であるほか、戻り値もkで受信しなければならない.そうしないと、受信できないデータが発生する場合がある.
//     
ProductBean bean= new ProductBean()
//   Product  
bean.set()....
//     ,        
bean = Exchanger   .exchange(bean)

//      
ProductBean bean = new ProductBean();
bean = Exchanger   .exchange(bean)

生産者は生産したProductBeanをpipelineに入れ,交換を待つ.消費者は空のBeanをpipelineに入れて交換を待つ.生産者であれ消費者であれ、exchangeメソッドの戻り値を受信し、exchangeのbeanにbeanに値を割り当てる必要があります.双方が交換を完了すると、交換のbeanはexchangeの戻り値となる.戻り値のbeanを指定する必要があります.そうしないと、生産者が生産したbeanは消費者の空のbeanと交換されません.
このクラスの最も詳細な説明は、ソースコードに属するアルゴリズムに関する注釈であり、この部分はdocドキュメントに表示されず、ソースコードを見なければ表示されません.このコメントでは
The basic idea is to maintain a "slot", which is a reference to a Node containing both an Item to offer and a "hole"waiting to get filled in.
最も基本的な考え方は、交換用のItemと充填待ちのholeを含むノードを指すSlot(スロット)を維持することである.
このholeは実は交換を受信ためのNodeである.
このアルゴリズムの解釈は5つの部分に分かれています.
  • Waiting
  • Sizing
  • Hashing
  • Probing
  • Padding

  • また、このクラスの著者Doug Leaには、この思想に関する論文A Scalable Elimination-based Exchange Channelが添付されており、無料で入手できます.
    ある学生は以下の図を作って、比較的に分かりやすいです.この図の説明についてはJava Concurrency(26):同時コンテナpart 11 Exchanger