二进制信号量的 java 结构
What java structure for a binary semaphore
我有:
- 产生项目的线程很多
- 一个通过显示项目更新 GUI 的线程
要点:
- 生产物品比更新 GUI 快得多
- 我们可能会同时生产很多新商品
- 每个项目生产后都必须进行一次 GUI 更新
- 如果产品同时出现,则所有产品之后必须仅 一次更新.. 无需刷新 GUI 超过一次
我想我正在寻找一些实现二进制信号量的标准结构,其中允许的最大数量为 1,以便工作人员可以调用多个 release()
而不会相互阻塞,并且如果 release()
被调用,然后:
- 如果 GUI 线程正在休眠 => 它被唤醒
- 如果 GUI 线程正在执行其例程 => 它必须在结束后重新启动它,然后才能再次休眠
代码应如下所示:
[Workers]
.. produce item ..
sem.release()
[GUI Thread]
while(true) {
sem.acquire()
.. update gui ..
}
请注意,使用 1 个可用许可初始化的 Semaphore
不是这种情况的解决方案,因为许多工人同时完成他们的任务应该只释放一个许可;否则 GUI 线程会 运行 太多次
使用信号量?
生产者 'up' 每生产一个项目,信号量加 1。
Consumer 'downs' 信号量由尽可能多的;像这样:
sema.acquire();
n = 1;
while (sema.tryAcquire(very short timeout))
++n;
// there are now known to be n items available
也许在 GUI 末尾的 tryAcquire 上有相同的循环 'routing',不管它是什么。
这有点活泼。您对 仅 一次更新的要求有多严格?你能忍受偶尔得到不止一个吗?
如果必须恰好只有一次更新,则需要双向互锁(即经典的生产者-消费者)。如果没有它,无论您做什么,都无法在您决定已全部完成后的几纳秒内阻止生产者生产 'just one more item'。要关闭该漏洞,需要告知生产者在 GUI 更新时推迟。
我有:
- 产生项目的线程很多
- 一个通过显示项目更新 GUI 的线程
要点:
- 生产物品比更新 GUI 快得多
- 我们可能会同时生产很多新商品
- 每个项目生产后都必须进行一次 GUI 更新
- 如果产品同时出现,则所有产品之后必须仅 一次更新.. 无需刷新 GUI 超过一次
我想我正在寻找一些实现二进制信号量的标准结构,其中允许的最大数量为 1,以便工作人员可以调用多个 release()
而不会相互阻塞,并且如果 release()
被调用,然后:
- 如果 GUI 线程正在休眠 => 它被唤醒
- 如果 GUI 线程正在执行其例程 => 它必须在结束后重新启动它,然后才能再次休眠
代码应如下所示:
[Workers]
.. produce item ..
sem.release()
[GUI Thread]
while(true) {
sem.acquire()
.. update gui ..
}
请注意,使用 1 个可用许可初始化的 Semaphore
不是这种情况的解决方案,因为许多工人同时完成他们的任务应该只释放一个许可;否则 GUI 线程会 运行 太多次
使用信号量?
生产者 'up' 每生产一个项目,信号量加 1。
Consumer 'downs' 信号量由尽可能多的;像这样:
sema.acquire();
n = 1;
while (sema.tryAcquire(very short timeout))
++n;
// there are now known to be n items available
也许在 GUI 末尾的 tryAcquire 上有相同的循环 'routing',不管它是什么。
这有点活泼。您对 仅 一次更新的要求有多严格?你能忍受偶尔得到不止一个吗?
如果必须恰好只有一次更新,则需要双向互锁(即经典的生产者-消费者)。如果没有它,无论您做什么,都无法在您决定已全部完成后的几纳秒内阻止生产者生产 'just one more item'。要关闭该漏洞,需要告知生产者在 GUI 更新时推迟。