当前位置: 代码迷 >> 综合 >> Day23:多线程
  详细解决方案

Day23:多线程

热度:110   发布时间:2023-09-29 18:53:56.0
  • 多线程编程方式
  1.  Thread 、Operation、OperationQueue、GCD
  •  Thread

 Thread在多线程技术中是最轻量级的,但是需要自己管理线程的生命周期和线程同步。线程同步对数据的枷锁会有一定的系统开销。

//1、创建import PlaygroundSupportPlaygroundPage.current.needsIndefiniteExecution = truefor i in  0..<10{Thread.detachNewThread {print(i)//结果:0791234568}
}class ObjectThred {func threadTest(){let thread = Thread(target: self, selector: #selector(threadWorker), object: nil)thread.start()}@objc  func threadWorker(){print("threadWorker")}
}let obj = ObjectThred()
obj.threadTest()

  • Operation概述
  1. 面向对象
  2. Operation + OperationQueue
  3. 取消、依赖、任务优先级、复杂逻辑、保存业务状态、子类化。
  • Operation分类
  1. Operation 和 BlockOperation
  • Operation状态
  1. isReady\isExcuting\isFinish\isCancelled
  • Operation运行方式
  1. sync\main()\async
  • OperationQueue
  1. OperationQueue 队列里可以加入很多个Operation,可以把OperationQueue看做一个线程池,可往线程池添加操作(Operation)到队列中。
  2. 底层使用GCD。
  3. maxConcurrentOperationcount 可以设置最大并发数。
  4. defaultMaxConcurrentOperationCount 根据当前系统条件动态确定的最大并发数。
  5. 可以取消所有Operation,但是当前执行的不会取消。
  6. 所有Operation执行完毕后销毁。
  • Operation 完成的回调
  1. completionBlock
class ObjectOperation{func test(){/* Myoperation() 自定义的替换let operation = BlockOperation {[weak self] inself?.operationWorker()}*/let operation = Myoperation()operation.completionBlock = { () ->Void inprint("completionBlock")}let queue = OperationQueue()queue.addOperation(operation)}@objc func operationWorker(){sleep(1)print("operationWorker")}
}class Myoperation:Operation {override func main() {sleep(1)print("My operationWorker")}
}let obj = ObjectOperation()
obj.test()
print("after")

  

  • GCD 基本操作
  1. sync 、async 、asyncAfter
  • GCD 串行VS并行
  1. 串行和并行描述的是任务之间如何运行。串行任务每一次仅执行一个任务。并行任务可以多个同时执行。
  • GCD 同步VS异步
  1. 描述的是执行任务的过程。同一个过程需要等待另一个过程执行完再执行为同步。
  • GCD sync
  1. 提交任务到当前队列里,并且直到任务执行完成,当前队列才会返回。
  • GCD async
  1. 调度一个任务去立即执行,但是不用等任务执行完当前队列就会返回。
  • GCD asyncAfter
  1. 调度一个任务去多久之后执行,但是不用等任务执行完当前队列就会返回。
  • 【代码演示】
    let queue = DispatchQueue(label: "myQueue",qos: DispatchQoS.default,attributes: DispatchQueue.Attributes.concurrent,autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit,target: nil)
    queue.sync {print("sync tset")
    }print("after invoke queue method")/**结果:sync tsetafter invoke queue method*/queue.async {sleep(2)print("async tset")
    }/**结果:  after invoke queue methodasync tset*/queue.asyncAfter(deadline: .now() + 3){print("asyncAfter tset")
    }print("asyncAfter invoke queue method")
    /**结果:  asyncAfter invoke queue methodasyncAfter tset*/