美文网首页
加深对GCD的印象(Swift)

加深对GCD的印象(Swift)

作者: 激动的厨师 | 来源:发表于2022-11-02 15:49 被阅读0次

为加深对GCD的印象和了解,抽时间在playground上演练一遍

import UIKit

let item1 = DispatchWorkItem {
    for i in 0...4{
        print("item1 -> \(i)  thread: \(Thread.current)")
    }
}


let item2 = DispatchWorkItem {
    for i in 0...4{
        print("item2 -> \(i)  thread: \(Thread.current)")
    }
}

let item3 = DispatchWorkItem {
    for i in 0...4{
        print("item3 -> \(i)  thread: \(Thread.current)")
    }
}

let item4 = DispatchWorkItem {
    for i in 0...4{
        print("item4 -> \(i)  thread: \(Thread.current)")
    }
}


//主队列是串行队列 运行在主线程上
let mainQueue = DispatchQueue.main
mainQueue.async(execute: item1)
mainQueue.async(execute: item2)
mainQueue.async(execute: item3)
mainQueue.async(execute: item4)

//主队列执行同步任务会死锁,原因是相互等待执行,也就是说主队列只能执行异步任务
mainQueue.sync(execute: item4)

//global为全局队列,并行队列,能开启多个线程(异步)
//并行队列嵌套 任务不会引起死锁
let globalQueue = DispatchQueue.global()
//同步任务会交给主线程按顺序处理
globalQueue.sync(execute: item1)
globalQueue.sync(execute: item2)
globalQueue.sync(execute: item3)
globalQueue.sync(execute: item4)

//异步任务开启了多个线程,有可能一个线程处理多个异步任务,并不是每个异步都有一个独立的线程
//线程之间执行顺序不固定
globalQueue.async(execute: item1)
globalQueue.async(execute: item2)
globalQueue.async(execute: item3)
globalQueue.async(execute: item4)

//自定义串行队列
let serialQueue = DispatchQueue(label: "serial")
//自定义串行队列,异步任务,开启了线程,但是只会开启一个线程,任务按顺序执行
serialQueue.async(execute: item1)
serialQueue.async(execute: item2)
serialQueue.async(execute: item3)
serialQueue.async(execute: item4)
//自定义串行队列,同步任务,没有开启线程,运行在主线程上,任务按顺序执行
serialQueue.sync(execute: item1)
serialQueue.sync(execute: item2)
serialQueue.sync(execute: item3)
serialQueue.sync(execute: item4)

//自定义串行队列,异步嵌套异步不会死锁
serialQueue.async {
    print("异步嵌套异步1")
    serialQueue.async {
        print("异步嵌套异步2")
    }
}
//自定义串行队列,同步嵌套异步不会死锁
serialQueue.sync {
    print("同步嵌套异步1")
    serialQueue.async {
        print("同步嵌套异步2")
    }
}

//自定义串行队列,异步嵌套同步会死锁
serialQueue.async {
    print("异步嵌套同步1")
    serialQueue.sync {
        print("异步嵌套同步2")
    }
}

//自定义串行队列,同步嵌套同步会死锁
serialQueue.sync {
    print("同步嵌套同步1")
    serialQueue.sync {
        print("同步嵌套同步2")
    }
}

//🔼总结自定义串行队列死锁,不能内部嵌套同步任务

//自定义并行队列,的特性和 global一样,区别只是,global是全部并行队列,concurrentQueue是自定义的,
//还有个区别是 global的挂起方法是无效的,global.suspend(),自定义的挂起方法是有效的
let concurrentQueue = DispatchQueue(label: "concurrent",attributes: .concurrent)

//队列、线程总结,死锁的不是线程,是队列



相关文章

  • 加深对GCD的印象(Swift)

    为加深对GCD的印象和了解,抽时间在playground上演练一遍

  • Swift-GCD

    对原Swift-GCD升级 SwiftGCD Swift-GCD Package GCDGroup, GCDQue...

  • swift GCD-定时器(DispatchSourceTime

    前言: 了解swift GCD 与OC GCD请看我的其他总结文章,这篇文章只是对swift GCD定时器的一个实...

  • GCD 必修技能

    本文来自《iOS程序员面试笔试宝典》,纯手工打造 只为学习用,加深印象 GCD必修技能 GCD ,又叫大中央调度,...

  • 3、GCD-swift

    GCD 一直以来是基于 c 语言的。apple 为了使 GCD 使用更加的 swift 化。 对 GCD 进行了...

  • Swift3使用GCD和DispatchQueues关于gcd

    关于对gcd 的使用,有几个链接写的还是相当不错的。Swift3使用GCD和DispatchQueueshttp:...

  • GCD

    iOS多线程 Swift4 GCD深入解析swift GCD 的一些高级用法GCD 之线程组(Dispatch G...

  • swift中GCD的使用详情

    想看swift3.0使用GCD,请点击GCD详解 想看swift3.0闭包的使用和介绍,请点击Swift版闭包使用...

  • GCD 在 Swift 中的用法

    DispatchQueue Swift 中,对 GCD 语法进行了彻底改写。引入了 DispatchQueue 这...

  • Swift 3.0 中GCD的使用

    Swift 3.0 中GCD的使用

网友评论

      本文标题:加深对GCD的印象(Swift)

      本文链接:https://www.haomeiwen.com/subject/svpjtdtx.html