Semaphore 的简单使用

本文通过一个生动的例子展示了如何使用Semaphore信号量来限制并发线程的数量,确保系统资源不会被过度消耗。信号量作为一种同步工具,可以有效地控制同时访问共享资源的线程数,避免资源竞争和死锁现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Semaphore 的使用,看了 api 后,我觉得就一个值得注意的,那就是:信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源

使用示例代码如下:

   @Test
	public void SemaphoreTest() throws Exception {
		CountDownLatch countDownLatch = new CountDownLatch(10);
		// 3  个工作人员
	    Semaphore semaphore = new Semaphore(3, true);
	    ExecutorService service = Executors.newFixedThreadPool(10);
        // 10 顾客
        for (int i = 0; i < 10; i++) {
            service.execute(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " 顾客来到指定受理地点");
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + " 工作人员对顾客事件进行处理");
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(Thread.currentThread().getName() + " 该顾客事件处理完毕,下一位顾客");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release();
                    countDownLatch.countDown();
                }
            });
        }
        service.shutdown(); 		
		countDownLatch.await();
	}
### 关于 Semaphore UI 的使用教程 Semaphore 是一种用于控制访问共享资源的同步原语,在多线程编程中非常有用。然而,提到 "semaphore ui" 可能是指某种特定的应用场景或工具,这并不常见。通常情况下,信号量(Semaphore)本身并不是一个UI组件。 如果假设问题是关于如何在用户界面(UI)设计中展示或管理信号量的状态,则可以考虑以下几种方式: #### 1. 显示当前可用许可数量 可以在界面上显示剩余可用的许可证数目,让用户了解还有多少次机会可以获得锁。例如,通过进度条或者数字计数器的形式展现给用户[^3]。 ```python import tkinter as tk from threading import BoundedSemaphore class UISemaphore(tk.Frame): def __init__(self, master=None, max_value=5): super().__init__(master) self.pack() self.sem = BoundedSemaphore(max_value) label_text = f"Available permits: {max_value}" self.label = tk.Label(self, text=label_text) self.label.pack() if __name__ == '__main__': root = tk.Tk() app = UISemaphore(master=root, max_value=3) app.mainloop() ``` #### 2. 提供获取/释放按钮 允许用户点击按钮模拟请求获得或释放信号量的操作,并实时更新界面上的信息。 ```python def acquire_permit(): global sem if not sem.acquire(False): status.set('No more available permits.') else: remaining_permits = sem._initial_value - (len(sem._cond.waiters())) status.set(f'Acquired! Remaining permits:{remaining_permits}') acquire_button = tk.Button(app, text="Acquire", command=acquire_permit) release_button = tk.Button(app, text="Release", command=lambda : sem.release()) status = tk.StringVar(value='Ready') tk.Entry(app,textvariable=status).pack(side=tk.BOTTOM) acquire_button.pack(side=tk.LEFT) release_button.pack(side=tk.RIGHT) ``` 以上代码片段展示了如何创建一个简单的Tkinter GUI应用程序来可视化信号量的行为。请注意,这里仅作为教学目的编写了一个简化版本;实际项目可能需要更复杂的设计模式和支持更多功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值