📜  科特林的信号灯

📅  最后修改于: 2021-08-29 11:25:57             🧑  作者: Mango

信号量是一组许可证。假设它是一个具有代币(许可证)以参加(执行)任务的盒子。线程可以访问信号量,但不能访问那些许可。根据许可的数量,以及当线程到达信号量时,会发出许可。如果线程在没有可用许可的情况下到达,则必须等待直到为其分配了许可。只有这样才能执行任务。

因此,基本上,信号量用于多线程或多线程应用程序中。一个应用程序中可以运行多个进程。信号量的使用是为了限制或控制多个线程(进程)对任何公共资源的访问。根据定义,信号量用于将信号从一个任务发送到另一任务。它们允许灵活的源管理。

使用信号量对多线程进程进行汽化

  1. 到达信号量的线程。
    多线程过程的汽化
  2. 信号量向线程分配许可,如果未达到许可,则停止其余线程。将许可分配给线程的过程称为“获取”
    多线程过程的汽化
  3. 任务完成后,先前运行的线程将释放许可证。这些许可证现在已分配给暂停的线程。线程提交回许可证的过程称为释放
    多线程过程的汽化

以下程序位于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)。