2016-04-30 21 views
1

だから私はかなりの助けが必要です。つまり、コーヒーショップをシミュレートすることです。 5席のコーヒーショップです。空席があるときに到着したらすぐに座席を取ることができます。しかし、5つの座席がいっぱいになると到着すると、すべての客がコーヒーを持っていることを意味します。座って座る前にパーティー全体が空いてしまうのを待たなければなりません。キューとセマフォを使用したコスプレマザー/従業員スレッドのシミュレーション

これは、スレッドを使用して実施する必要があります。顧客数はコマンドライン引数として渡されます。

とにかく、これについてどうやってどうやって解決するかがわかりません。

私は、提供されたSemaphoreクラスを使用し、 "CustomerThread"タイプの2つのキューを作成し、そのうちの1つを現在飲んでいる顧客のキューにし、または、ラインで待っているものがBlockedQueueであるべきですか?しかし、私はどのように5シートルールを実施するか分からない。たとえば、2つのスレッドが終了して店を出ると言うと、2つの座席が開いていますが、5つが開いている間は、次の5つを飲み口に追加して待ち行列から取り除くことはできません。

+0

私は飲んだり座ったりしません。待ち行列は待ち行列のためのものです。彼らが座って飲んでいる時間を決定するものがなければなりません。 5シートルールは、着信顧客を処理するロジック上の外部ロックで実行できます。すべてが消えたときに全部で5つの座席が取られ、解放されると、それは設定されます。 – ChiefTwoPencils

答えて

0

それはConditionsを見て価値がある、彼らはあなたが(それが一杯になったとき、我々は完全に空にショップを待つ必要がある)の要件を持っていなかったならば、Semaphoreが持っているだろう、Semaphoresよりカスタマイズしやすくなります最高だったら、Semaphoreと5 permitsを作成し、人が入るときはawait、離れるときはreleaseを作成します。しかし、これらの制約を使用すると、Conditionが良い選択になるかもしれません。

何かがそうです。

static class CoffeeShop{ 
    private final Lock lock = new ReentrantLock(); 
    private final Condition condition = lock.newCondition(); 
    private int counter = 0; 
    public void enter() throws InterruptedException { 
     try{ 
      lock.lock(); 
      if(counter<5){ 
       System.out.println(" in "+""+counter); 
       ++counter; 
      }else if(counter==5){ 
       System.out.println("shop is full"); 
       while (counter>0) { 
        condition.await(); 
       } 
       ++counter; 
       System.out.println(" in "+""+counter); 
      } 
     }finally { 
      lock.unlock(); 
     } 
    } 
    public void leave(){ 
     try{ 
      lock.lock(); 
      --counter; 
      if(counter==0){ 
      condition.signal(); 
      } 
     }finally { 
      lock.unlock(); 
     } 
    } 
} 

Conditionがあなたのために待機中のスレッドのキューを維持するので、あなたが、あなた自身の待ちキューを持っている必要はありません。

関連する問題