Java同步 - 等待n个线程到达

时间:2016-03-23 19:48:35

标签: java multithreading synchronization thread-safety semaphore

我们假设有一个理发师和一个顾客。理发师睡到五个顾客到来,当第五个顾客醒来理发师,他开始做他的工作。

序列顺序是这样的:唤醒 - >如果有空间(最多5人)并等待轮到您,请坐在理发店内 - >坐在椅子上 - >支付 - >如果你是最后一个顾客,没有人在里面/外面等待理发师睡着了。

如何处理此问题?

我的尝试:http://pastebin.com/G0CzJBVG

然而,它有缺陷。

1 个答案:

答案 0 :(得分:0)

根据您的描述,一旦理发师醒来就开始为顾客剪头发,并且必须在进入下一个之前完成第一个,所以你需要一个机制来确保客户按顺序处理他们来了。此外,在他工作的时候,其他顾客可能会来,他也不会停下来睡觉,直到理发店里没有人。

我的建议如下:

  • 你将有两个线程:一个线程用于理发师,完成其工作,另一个用于客户签入;
  • 要保留订单,请使用ArrayBlockingQueue,当客户来到理发店时,第二个帖子会不断添加元素
  • 确保理发师仅在有5位客户时才开始工作,每次添加新客户时都使用CountDownLatch(5),第二个线程正在调用countDown(),但仅限{{1}第一个线程在开始从getCount() != 0
  • 读取元素之前,正在调用await()
  • 每次第一个线程完成处理元素时,检查队列,如果队列中没有更多元素,它会重新初始化ArrayBlockingQueue并调用countDownLatch(5)阻塞直到队列又满了。
  • 最后,为了限制理发店中的客户数量,请创建容量为5的await()

我希望它能解决你的问题。