您的当前位置:首页正文

[Swift] A B C 3个线程 有顺序的循环执行代码

来源:图艺博知识网
今天朋友问了一个问题,就是标题,但是我特么百度一搜 Java 啥的一大堆 ,据说是面试题目, 我这里也就写了一个
金典题目:
有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程
 按顺序输出ABC, 无限循环
//这里采用信号量解决,GCD中 有3个函数是针对信号量(semaphore)的操作的
  dispatch_semaphore_create   创建一个semaphore
  dispatch_semaphore_signal   发送一个信号
  dispatch_semaphore_wait    等待信号

简单的说一下作用,套的百度到的话语,感觉不错

简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们
可以理解为信号的总量,
dispatch_semaphore_signal    是发送一个信号,自然会让信号总量加1

dispatch_semaphore_wait      等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的
执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建
一个并发控制来同步任务和有限资源访问控制

好了 废话不多说直接上代码


import Foundation

// 使用信号量
// 初始 A线程的信号量为 1 ,为了 A 线程不用等待直接执行
var ASemaphore = dispatch_semaphore_create(1)
var BSemaphore = dispatch_semaphore_create(0)
var CSemaphore = dispatch_semaphore_create(0)

var queue = dispatch_queue_create("com.maozhua", DISPATCH_QUEUE_CONCURRENT)

dispatch_async(queue) { () -> Void in
    while true{
        dispatch_semaphore_wait(ASemaphore, DISPATCH_TIME_FOREVER);
        print("A")
        dispatch_semaphore_signal(BSemaphore)
    }
}

dispatch_async(queue) { () -> Void in
    while true{
        dispatch_semaphore_wait(BSemaphore, DISPATCH_TIME_FOREVER);
        print("B")
        dispatch_semaphore_signal(CSemaphore)
    }
}

dispatch_async(queue) { () -> Void in
    while true{
        dispatch_semaphore_wait(CSemaphore, DISPATCH_TIME_FOREVER);
        print("C")
        dispatch_semaphore_signal(ASemaphore)
    }
}

//因为是写的命令行代码 所以 开启runloop  保证线程不死
NSRunLoop.mainRunLoop().run()

OK 结果,代码可以直接复制 运行 自己试试

Top