- @IBAction func useDispatchSuspend(_ sender: Any) {
- let queue = DispatchQueue(label: "new thread")
- // 挂起
- queue.suspend()
- queue.async {
- print("The queue is suspended. Now it has completed.\n The queue is \"\(queue.label)\". ")
- }
- print("The thread will sleep for 3 seconds' time")
- DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(3)) {
- // 唤醒,开端履行
- queue.resume()
- }
- }
我们也可以看一下控制条的打印结不雅。显然能看到代码并没有按照次序履行,新建的queue琅绫擎的打印是在被唤醒之后才履行的。
4. 旌旗灯号量(semaphore)
不要问我是哪个例子琅绫擎用到了,实袈溱想不起来了呀,只能记得有人问过semaphore这个。
有时刻多个线程对一个数据进行操作的时刻,会造成一些意想不到的效不雅。多小我同时对同一个数据进行操作,谁知道怎么搞啊!
为了包管同时只有一个线程来修改┞封个数据,这个时刻我们就要用到旌旗灯号岑岭。当旌旗灯号量为0的时刻,其他线程想要修改或者应用这个数据就必须要等待了,等待多久呐?DispatchTime.distantFuture,要等待这么久。意思就是一向等待下去。。。。OC琅绫擎管这个叫做DISPATCH_TIME_FOREVER。
如不雅给旌旗灯号量设置成了0,其实就意味着这个资本没有人可以或许再能用了。所以,当用完了之后必定要把旌旗灯号量设置成非0( ⊙ o ⊙ )!
4.1 简单实用一下
我们简单的让globalQueue这个全局队列按照1->5的次序进行打印,打印一次歇息1秒钟。
- @IBAction func useSemaphore(_ sender: Any) {
- let semaphoreSignal = DispatchSemaphore(value: 1)
- for index in 1...5 {
- DispatchQueue.global().async {
- semaphoreSignal.wait()
- print(Thread.current)
- print("这是第\(index)次履行.\n")
- semaphoreSignal.signal()
- }
- print("测试打印")
- }
- }
推荐阅读
沙龙晃荡 | 3月31日 京东、微博拭魅战专家与你合营商量容器技巧实践! 近日,Priceonomics网站应用Redbooth的数据,梳理统计出以前三年,40个国度所有行业的临盆和义务完成情况。结不雅显示>>>详细阅读
本文标题:Swift多线程:GCD进阶,单例、信号量、任务组
地址:http://www.17bianji.com/lsqh/40679.html
1/2 1