0

讓我們假設有一個理髮師和一個客戶。理髮師睡覺,直到5名顧客到達,當第五位顧客醒來理髮師,他開始做他的工作。Java同步 - 等待n個線程到達

序列順序是這樣的:清醒 - >如果有空間(最多5個人),坐在理髮店內等待輪到你 - >坐在椅子上 - >支付 - >如果你是最後一位顧客,沒有人在等待理髮師內部/外部入睡。

我該如何解決這個問題?

我嘗試:http://pastebin.com/G0CzJBVG

但是,它是有缺陷的。

+1

添加您的嘗試,請 – Andrew

+0

@AndrewTobilko完成。 – Hydroxis

+0

請添加您的內聯代碼,而不是作爲pastebin鏈接。問題不應該依賴於外部鏈接。 –

回答

0

從你的描述來看,一旦理髮師清醒,就開始爲顧客剪髮,並且必須在去下一個顧客之前完成第一個,所以你需要一個機制來確保顧客在他們來了。而且,當他在工作時,其他顧客可能會來,並且他不會停下來睡覺,直到理髮店裏沒有人。

我的建議如下:

  • 你將有兩個線程:一個線程是理髮,做他的工作,其他的爲客戶籤;
  • 維護秩序,請在其第二個線程不斷添加元素爲客戶提供ArrayBlockingQueue是來理髮店
  • 確保理髮僅開始工作時,有5個客戶,使用CountDownLatch(5)上第二線程是每次添加一個新客戶的時間打電話countDown(),但前提是getCount() != 0,而第一個線程持有調用await(),它開始從ArrayBlockingQueue
  • 每一個第一線程完成處理元素的時間閱讀元素之前,檢查隊列,並且如果隊列中沒有更多元素,則重新初始化countDownLatch(5)並調用await()阻塞,直到隊列再次滿。
  • 最後,爲了限制在理髮店客戶數量,容量爲5

我希望這回答了你的問題創造ArrayBlockingQueue