0

理髪師と顧客がいるとしましょう。 5人の顧客が到着するまで、そして5人目の顧客が理髪店を目覚めさせ、彼が仕事を始めるまで、この理髪師は眠ります。Java同期 - n個のスレッドが到着するのを待つ

順序は次のとおりです:awake - >スペースがあれば理髪店に座って(最大5人)、あなたのターンを待つ - >椅子に座る - >支払い - >あなたが最後の顧客で誰も待っていない理髪店の内外は眠りに落ちる。

どのようにこの問題にアプローチしますか?

私の試み:http://pastebin.com/G0CzJBVG

しかし、それは欠陥があります。床屋が起きている一度あなたの説明から、

+1

あなたの試行を追加してください。 – Andrew

+0

@AndrewTobilko done。 – Hydroxis

+0

コードをペーストビンのリンクとしてではなく、インラインで追加してください。質問は外部リンクに依存すべきではありません。 –

答えて

0

は、顧客のために髪をカットを開始し、次のいずれかに行く前に最初の1を完了しなければならないので、あなたは、顧客がで処理されていることを確認するためのメカニズムを必要としています彼らが来る順序。また、彼が働いている間、他の顧客が来るかもしれないし、理髪店に誰もいなくなるまで、彼はやめずに眠りにつくだろう。

私の提案は以下の通りです:

  • 次の2つのスレッドを持つことになります:1つのスレッドが、床屋のためである彼の仕事をして、顧客のチェックインのための他;
  • が第二のスレッドは、顧客などの要素を追加し続けているにArrayBlockingQueueを使用し、順序を保持することが
  • は床屋しかない5人の顧客は、CountDownLatch(5)を使用するときに作業を開始することを確認するために理髪店に来ている第二のそれはArrayBlockingQueue
  • から最初のスレッドが要素を処理するのに終えるたびに、要素の読み込みを開始する前に最初のスレッドは、await()への呼び出しを保持している間、スレッドは、それが新しい顧客を追加するたびcountDown()を呼び出すが、唯一getCount() != 0場合れますキューをチェックし、キューにそれ以上要素がない場合は、countDownLatch(5)を再初期化し、を呼び出しますは、キューがいっぱいになるまでブロックします。
  • 最後に、理髪店に顧客の数を制限するために、私はそれはあなたの問題の答えを期待5.

の容量を持つArrayBlockingQueueを作成します。

関連する問題