Java Concurrentプログラミングの境界キャッシュの実装
1。境界キャッシュのベースクラス
パッケージcn.xf.cp.ch14;/** *関数:境界キャッシュを実装しますベースクラス *時間:2:20:00 pm *ファイル:baseboundedbuffer.java * @著者管理者 * * @param <v> */public class baseboundedbuffer <v> {private final v [] buf;プライベートインターテール;プライベートINTヘッド;プライベートインクカウント; public BaseBoundedBuffer(int capacity){//配列を初期化this.buf =(v [])new object [capuation]; } //データを入力すると、最終的なメソッドを書き直すことはできません。 if(++ tail == buf.length){tail = 0; } //メソッド、合計量++ ++カウントを挿入します。 } / ***データを取り出します* @return* /保護された同期最終v dotake(){v v = buf [head]; buf [head] = null; if(++ head == buf.length){head = 0; } - count; vを返します。 } //カウントを判断することにより、配列が完全に公開されているかどうかを判断します。 } public Synchronized final boolean isempty(){return count == 0; }}2。操作を実行する前に前提条件を決定します
パッケージcn.xf.cp.ch14;/***関数:挿入を確認し、最初に要素操作を取得し、次に操作を実行します。検証は通過せず、操作を許可されません *時間:2:33:41 PM *ファイル:grumpyboundedbuffer.java * @著者管理者 * * @param <v> */public class grumpyboundedbuffer <v> baseboundedbuffer <v> {int(int super){super); } public synchronized void put(v v)throws Exception {//完全なキューの場合、新しい要素を挿入できません(this.isfull()){throw new Exception( "qule dexids"); } this.doput(v); } //同様に、キューが空の場合、新しい要素を取得できませんpublic同期v take()throws exception {if(this.isempty()){throw new Exception( "queue in the queue in"); } this.dotake(); }}3.ポーリングと睡眠を通して簡単なブロックを達成します
パッケージcn.xf.cp.ch14;/** *関数:ポーリングと冬眠による単純なブロッキングを実装 * 2000; public Sleepyboundedbuffer(int capacity){super(capacity); } //キューパブリックボイドプット(v v)スローを入力すると、挿入されたexception {//ループはここでロックされていません。そうしないと、ロックは解放されません。冬眠がロックされていない場合、睡眠はロックされ、他の人は冬眠中にそれを操作できません。要素が同期しない(this){//キューが満たされていない場合、(!this.isfull()){this.doput(v);戻る; }} //それ以外の場合は、sweet.sleep(sleep_ granularity)を占有するためにCPUを睡眠と出口を終了します。 }} public v take()throws arturnedexception {while(true){//ループはここでロックされていません。そうしないと、ロックはリリースされません。睡眠がロックされていない場合、睡眠はロックされ、睡眠時に他の睡眠はそれを操作できません。同期(this)で新しい要素が発生することはありません(//配列部分が空の場合、データを取得できます(!this.isempty()){return this.dotake(); } //キューが空の場合は、もう一度数秒間寝てみてください} swree.sleep(sleep_granularity); }}}4。条件付きキュー
パッケージcn.xf.cp.ch14;/** *関数:条件キューを使用 * } /** * data要素 * @param v * @throws arturnedexception * /public synchronized void put(v v)throws interruptedexception {while(this.isfull()){//ここでプログラムを一時停止すると、ロックがリリースされます。wait(); } //キューがいっぱいになっていない場合、プログラムは目覚め、ロックはthis.doput(v)を取り戻します。 //実行が終了し、他のキューを起動しますthis.notifyall(); } public synchronized v take()throws arturnedexception {while(this.isempty()){this.wait(); } v v = this.dotake(); this.notifyall(); vを返します。 }}読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!