信号量是一组许可证。假设它是一个具有代币(许可证)以参加(执行)任务的盒子。线程可以访问信号量,但不能访问那些许可。根据许可的数量,以及当线程到达信号量时,会发出许可。如果线程在没有可用许可的情况下到达,则必须等待直到为其分配了许可。只有这样才能执行任务。
因此,基本上,信号量用于多线程或多线程应用程序中。一个应用程序中可以运行多个进程。信号量的使用是为了限制或控制多个线程(进程)对任何公共资源的访问。根据定义,信号量用于将信号从一个任务发送到另一任务。它们允许灵活的源管理。
使用信号量对多线程进程进行汽化
- 到达信号量的线程。
- 信号量向线程分配许可,如果未达到许可,则停止其余线程。将许可分配给线程的过程称为“获取” 。
- 任务完成后,先前运行的线程将释放许可证。这些许可证现在已分配给暂停的线程。线程提交回许可证的过程称为释放。
以下程序位于Kotlin中,该示例是使用信号量在多线程进程中运行某些活动的示例:
- 向信号量分配的许可值为2,这意味着一次只能运行2个线程。
- 以下代码中声明的线程的睡眠活动为10秒(10000毫秒),这意味着任何线程在10秒钟内都将获得许可。
- 声明了打印函数以打印“。”表示线程活动已完成且许可已释放。
- 由于没有为任何线程分配优先级,因此将对所有线程分配NORM_PRIORITY(默认优先级= 5),并且优先级会优先到达第一个到达的线程。
import java.util.concurrent.Semaphore
val s = Semaphore(2)
val t1 = Thread(Runnable
{
s.acquireUninterruptibly()
print("t1")
Thread.sleep(10000)
print(".")
s.release()
})
val t2 = Thread(Runnable
{
s.acquireUninterruptibly()
print("t2")
Thread.sleep(10000)
print(".")
s.release()
})
val t3 = Thread(Runnable
{
s.acquireUninterruptibly()
print("t3")
Thread.sleep(10000)
print(".")
s.release()
})
val t4 = Thread(Runnable
{
s.acquireUninterruptibly()
print("t4")
Thread.sleep(10000)
print(".")
s.release()
})
t1.start()
t2.start()
t3.start()
t4.start()
输出:
t1t2..t3t4..
这里的2个点,即输出“ ..”表示许可获取和许可释放之间的10秒wait(Thread.sleep)。
Note: Setting Priority to the Threads is possible. In such a case, the Threads are in Priority order and likewise, Permits are assigned to them. Multiple Semaphores can be declared depending upon the number of resources required by the process.